八求Hamilton回路.docx

上传人:b****8 文档编号:28406005 上传时间:2023-07-13 格式:DOCX 页数:16 大小:44.31KB
下载 相关 举报
八求Hamilton回路.docx_第1页
第1页 / 共16页
八求Hamilton回路.docx_第2页
第2页 / 共16页
八求Hamilton回路.docx_第3页
第3页 / 共16页
八求Hamilton回路.docx_第4页
第4页 / 共16页
八求Hamilton回路.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

八求Hamilton回路.docx

《八求Hamilton回路.docx》由会员分享,可在线阅读,更多相关《八求Hamilton回路.docx(16页珍藏版)》请在冰豆网上搜索。

八求Hamilton回路.docx

八求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回路,用“下一个”或“上一个”按钮进行选择。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1