#include <stdio.h>
#define MAX 100
void hamilton(int n, int x[MAX], int c[MAX][MAX]){
int i,k;
int visited[MAX];
for( i = 0; i <= n ; i++){
x[i] = 0;
visited[i] = 0;
}
printf("初始化\n");
k = 0;
visited[0] = 1;
x[0] = 0;
k = k + 1;
while(k >= 0){
x[k] = x[k] + 1;
printf("顶点 %d, 访问 %d\n", k, x[k]);
while(x[k] < n){
i = x[k-1];
printf("搜索 顶点 %d, 访问 %d, 上个 %d, 连接 %d\n", k, x[k], i, c[i][x[k]]);
if(visited[x[k]]==0 && c[i][x[k]] == 1){
printf("%d-%d 连通未记录\n", k-1, k);
break;
}else{
x[k] = x[k]+1;
}
}
printf("-顶点 %d, 访问 %d\n", k, x[k]);
if(x[k] < n && k == n-1&& c[x[k]][0] == 1 ){
printf("结束\n");
for(i = 0; i < n ; k++){
printf("%d-- ", x[k]);
}
printf("%d-- ", x[0]);
return;
}else if( x[k]<n && k<n-1){
printf("记录 顶点=%d,x[k]=%d,visited[x[k]]=%d\n", k, x[k], visited[x[k]]);
visited[x[k]]=1;
k = k + 1;
}else{
printf("回溯 顶点=%d,x[k]=%d,visited[x[k]]=%d\n", k, x[k], visited[x[k]]);
x[k] = 0;
visited[x[k]] = 0;
k=k-1;
}
}
printf("x: ");
for(k=0;k<n;k++){
printf("%d,", x[k]);
}
printf("visited: ");
for(k=0;k<n;k++){
printf("%d,", visited[k]);
}
}
int main () {
printf("算法-无向图连通图-哈密尔顿Hamilton回路! - c.jsrun.net.\n");
int n = 4;
int t[4][4] = {{0,1,0,1},{1,-1,1,0},{0,1,0,1},{1,0,1,0}};
int d[] = {0,1,2,3};
hamilton(n, d, t);
return 0;
}