八求Hamilton回路.docx
《八求Hamilton回路.docx》由会员分享,可在线阅读,更多相关《八求Hamilton回路.docx(16页珍藏版)》请在冰豆网上搜索。
八求Hamilton回路
求Hamilton回路
(1)功能
在n个顶点的图G中,一条Hamilton回路是一顶点序列v1,v2,····vn其中,每个顶点vi由一条边连到vi+1(i=1,2,·····,n-1),而vn被连到v1。
(2)调用方式
先输入顶点个数(3~9),点“确定”后将出现顶点图示,再将每条边按起始点、终点输入。
每输入一条边起、终点后,按“输入”确认,就可在图形中显示该边。
当所有边输入完毕后,按“完成”键,将计算所有的Hamilton回路。
然后点击下方的“下一个”或“上一个”按钮将在图上用有色线段依次表示出每一个Hamilton回路。
(3)算法说明
一步一步的构造Hamilton回路,并且在每一步都进行测试,看看局部构造的向量是否有可能扩充为一个Hamilton回路,若不能就立即删除它并转到下一步。
Substep2()
nc=stack(m)
m=m-1
Ifnc<>0Then
step3
Else
k=k-1
Ifk<>0Then
step2
Else
index=False
EndIf
EndIf
EndSub
Substep3()
A(k)=stack(m)
stack(m)=nc-1
Ifkk=k+1
step4
EndIf
EndSub
Substep4()
Forj=1Ton
vert(j)=False
Nextj
Fori=1Ton
Ifpm(i,A(k-1))=1Orpm(A(k-1),i)=1Then
vert(i)=True
EndIf
Nexti
Fori=1Tok-1
vert(A(i))=False
Nexti
Ifk<>nThen
step5
Else
step6
EndIf
EndSub
Substep5()
b=0
Fori=1Ton
Ifvert(i)=TrueThen
m=m+1
stack(m)=i
b=b+1
EndIf
Nexti
m=m+1
stack(m)=b
step2
EndSub
Substep6()
b=0
Fori=1Ton
Ifvert(i)=TrueAndpm(i,1)=1Then
m=m+1
stack(m)=i
b=1
ExitFor
EndIf
Nexti
m=m+1
IfbThen
stack(m)=1
Else
stack(m)=0
EndIf
step2
EndSub
(4)程序清单
DimansAsString
DimPIAsDouble
Dimstack(37),ep(3,37),st(999,10),pm(10,10),om(10,10),A(10),z1(10),x(10),y(10),d(10)AsInteger
Dimb,h,nc,i,j,c,e,k,m,n,p,q,sAsInteger
DimlineiAsInteger
Dimindex,vert(10)AsBoolean
Substep1()
index=True
k=1
A
(1)=1
stack
(1)=1
stack
(2)=1
m=2
step2
Fori=1Ton
Forj=1Ton
If(st(h,i)=ep(1,j)Andst(h,i+1)=ep(2,j))Or(st(h,i)=ep(2,j)Andst(h,i+1))=ep(1,j)Then
d(i)=j
EndIf
Nextj
Nexti
Line(x(ep(1,d(linei))),y(ep(1,d(linei))))-(x(ep(2,d(linei))),y(ep(2,d(linei)))),QBColor
(1)
EndSub
Substep2()
nc=stack(m)
m=m-1
Ifnc<>0Then
step3
Else
k=k-1
Ifk<>0Then
step2
Else
index=False
EndIf
EndIf
EndSub
Substep3()
A(k)=stack(m)
stack(m)=nc-1
Ifkk=k+1
step4
EndIf
EndSub
Substep4()
Forj=1Ton
vert(j)=False
Nextj
Fori=1Ton
Ifpm(i,A(k-1))=1Orpm(A(k-1),i)=1Then
vert(i)=True
EndIf
Nexti
Fori=1Tok-1
vert(A(i))=False
Nexti
Ifk<>nThen
step5
Else
step6
EndIf
EndSub
Substep5()
b=0
Fori=1Ton
Ifvert(i)=TrueThen
m=m+1
stack(m)=i
b=b+1
EndIf
Nexti
m=m+1
stack(m)=b
step2
EndSub
Substep6()
b=0
Fori=1Ton
Ifvert(i)=TrueAndpm(i,1)=1Then
m=m+1
stack(m)=i
b=1
ExitFor
EndIf
Nexti
m=m+1
IfbThen
stack(m)=1
Else
stack(m)=0
EndIf
step2
EndSub
PrivateSubCommand1_Click()
c=0
IfNotIsNumeric(Text1.Text)OrNotIsNumeric(Text2.Text)Then'输入边的信息
c=MsgBox("顶点必须为数字,请从新输入",0)
Text1.Text=""
Text2.Text=""
ExitSub
Else
i=Int(Text1.Text)
j=Int(Text2.Text)
EndIf
Ifi<1Ori>nOrj<1Orj>nThen'判断顶点合法
c=MsgBox("顶点有误,请从新输入",0)
Text1.Text=""
Text2.Text=""
EndIf
Forh=0Ton
If(i=ep(1,h)Andj=ep(2,h))Or(j=ep(1,h)Andi=ep(2,h))Then
c=MsgBox("该边已经添加,请输入下一条边:
",0)
Text1.Text=""
Text2.Text=""
EndIf
Nexth
Ifc=0Then'画边
s=s+1
ep(1,s)=i
ep(2,s)=j
pm(i,j)=1
pm(j,i)=1
Line(x(i),y(i))-(x(j),y(j)),QBColor(0)
Text1.Text=""
Text2.Text=""
EndIf
EndSub
PrivateSubCommand2_Click()
q=0
index=True
k=1
A
(1)=1
stack
(1)=1
stack
(2)=1
m=2
Whileindex
step2
Ifindex=TrueThen
q=q+1
Fori=1Ton
st(q,i)=A(i)
Nexti
st(q,i)=1
EndIf
Wend
Command1.Enabled=False
Command3.Enabled=False
Label3.Caption="共有"&q&"个Hamilton回路"
Command4.Visible=True
Command5.Visible=True
Ifn-1>0Then
Command4.Enabled=True
EndIf
h=0
EndSub
PrivateSubCommand3_Click()
c=0
IfNotIsNumeric(Text3.Text)Then'输入顶点个数
c=MsgBox("请输入3-9的整数",0)
Text1.Text=""
Else
n=Int(Text3.Text)
Ifn<2Orn>9Then
c=MsgBox("顶点个数有误,请从新输入",0)
Text3.Text=""
EndIf
EndIf
Ifc=0Then'依据顶点个数画图
DimraAsInteger
ScaleTop=-1100
ScaleLeft=-700
ScaleHeight=2000
ScaleWidth=2000
Fori=1Ton
FillColor=QBColor(0)
FillStyle=0
x(i)=Cos(2*PI*(i-1)/n)*500
y(i)=Sin(2*PI*(i-1)/n)*500
Circle(x(i),y(i)),7,QBColor(0)
CurrentX=x(i)*1.2
CurrentY=y(i)*1.2
Printi
Nexti
Command1.Enabled=True
Command2.Enabled=True
EndIf
EndSub
PrivateSubCommand4_Click()
h=h+1
Timer1.Enabled=False
Ifh>1Then
Command5.Enabled=True
EndIf
Fori=1Tos
Me.DrawWidth=2
Line(x(ep(1,i)),y(ep(1,i)))-(x(ep(2,i)),y(ep(2,i))),BackColor
Me.DrawWidth=1
Line(x(ep(1,i)),y(ep(1,i)))-(x(ep(2,i)),y(ep(2,i))),QBColor(0)
Nexti
Timer1.Enabled=True
Label3.Caption="现在是第"&h&"/"&q&"个Eular回路"
Ifh=qThen
Command4.Enabled=False
EndIf
EndSub
PrivateSubCommand5_Click()
h=h-1
Timer1.Enabled=False
IfhCommand4.Enabled=True
EndIf
Fori=1Tos
Me.DrawWidth=2
Line(x(ep(1,i)),y(ep(1,i)))-(x(ep(2,i)),y(ep(2,i))),BackColor
Me.DrawWidth=1
Line(x(ep(1,i)),y(ep(1,i)))-(x(ep(2,i)),y(ep(2,i))),QBColor(0)
Nexti
Fori=1Ton
d(i)=st(h,i)
Nexti
Timer1.Enabled=True
Label3.Caption="现在是第"&h&"/"&q&"个Eular回路"
Ifh=1Then
Command5.Enabled=False
EndIf
EndSub
PrivateSubCommand6_Click()
Timer1.Enabled=True
EndSub
PrivateSubForm_Load()
PI=3.1415926
k=1
n=0
linei=1
Fori=0To9'初始化
A(i)=0
Forj=0To9
pm(i,j)=0
Nextj
Nexti
EndSub
PrivateSubTimer1_Timer()
Me.DrawWidth=2
Line(x(st(h,linei)),y(st(h,linei)))-(x(st(h,linei+1)),y(st(h,linei+1))),QBColor
(1)
Me.DrawWidth=1
linei=linei+1
Iflinei>nThen
Timer1.Enabled=False
linei=1
c=MsgBox("结束",0)
EndIf
EndSub
(5)实例
1、输入顶点个数:
4
2、依次输入各边:
1-2、2-3、1-3、1-4、2-4、3-4、。
3、点“完成”后,生成Hamilton回路,用“下一个”或“上一个”按钮进行选择。