9、回溯法求解哈密尔顿回路 联系客服

发布时间 : 星期二 文章9、回溯法求解哈密尔顿回路更新完毕开始阅读75e5ae290066f5335a812146

回溯法求解一般哈密顿尔回路

{

if(k>n-1 && c[x[k-1]][0]==1)

{ }

output(x); flag=1;

else

for(int i=k;i

swap(x[k],x[i]);

if ( c[x[k-1]][x[k]]==1)

hamilton(k+1);

swap(x[i],x[k]); }

}

2.2非递归回溯法求解哈密顿尔回路算法

2.2.1非递归回溯法求图的所有哈密顿尔回路算法

假定图G=(V, E)的顶点集为V={1, 2, ?, n},则哈密顿回路的可能解表示为n元组X=(x1, x2, ?, xn),其中,xi∈{1, 2, ?, n} ,并有如下约束条件:

(xi, xi+1)∈E (1≤i≤n-1) (xn, x1)∈E xi≠xj (1≤i, j≤n,i≠j) 由此可得以下算法:

1.将顶点数组x[n]初始化为0,标志数组visited[n]初始化为0; 2.k=1; visited[1]=1; x[1]=1; 从顶点1出发构造哈密顿回路;

2

回溯法求解一般哈密顿尔回路

3.while (k>=1)

3.1 x[k]=x[k]+1,搜索下一个顶点; 3.2 若(n个顶点没有被穷举) 执行下列操作

3.2.1 若(顶点x[k]不在哈密顿回路上&&(x[k-1],x[k])∈E), 转步骤3.3;

3.2.2 否则,x[k]=x[k]+1,搜索下一个顶点;

3.3 若数组x[n]已形成哈密顿路径,则输出数组x[n],算法结束; 3.4 否则,

3.4.1 若数组x[n]构成哈密顿路径的部分解, 则k=k+1,转步骤3;

3.4.2 否则,重置x[k],k=k-1,取消顶点x[k]的访问标志, 转步骤3;

3 设计方案

3.1整体设计方案

这两个算法是通过C++语言编程实现的,在主菜单栏可以分成三块:1、递归求图的所有哈密顿回路2、非递归求图的所有哈密顿回路0、退出程序。

3.2 程序递归算法的主要代码

void hamilton(int k ) {//递归算法

if(k>n-1 && c[x[k-1]][0]==1)

{ }

output(x); flag=1;

else

for(int i=k;i

3

回溯法求解一般哈密顿尔回路

swap(x[k],x[i]);

if ( c[x[k-1]][x[k]]==1)

hamilton(k+1);

swap(x[i],x[k]); }

}

3.3程序非递归算法的主要代码

void hamilton(int n, int x[N], bool c[N][N]) {//非递归算法 int i, k;

bool*visited = new bool[n]; for(i =0; i

x[i] = 0;

visited[i] = false; }

visited[0]=1;

x[0]=0;//默认以第一个城市开始

k =1; //搜索解空间树(子集树形式)直接从第二层开始 while(k >=1) {

x[k]++;

while(x[k] < n)

if(visited[x[k]]==0 && c[x[k - 1]][x[k]]==1) break; else

x[k]++;

if(x[k]

4

回溯法求解一般哈密顿尔回路

for(k=0;k

{

cout<

}

cout<

else if (x[k]

visited[x[k]]=1;

k++; } else }

}

{

x[k]=0; k--;

visited[x[k]]=0;

}

3.4程序的其他函数

3.4.1输出函数主要代码 void output(int x[]) {//输出函数 }

5

for(int i=0;i

cout<

cout<