八求Hamilton回路.docx
- 文档编号:28406005
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:16
- 大小:44.31KB
八求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
Ifk k=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 Ifk k=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 Ifh Command4.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回路,用“下一个”或“上一个”按钮进行选择。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hamilton 回路