波波老师这是我的哈密顿回路c++源程序,你看看对不对?

来源:9-3 实现哈密尔顿回路的算法

慕仰0554757

2020-10-27

//旅行商问题之一

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iomanip>
using namespace std;
int g[101][101],n,m,length,x,start;
bool v1[101];
int ans[101],num[101];
void print()  //打印结果
{    int i;
     for (i = 1; i <= length; i++)
         cout << ' ' << ans[i];
     cout << endl;   
}
bool allvisited(){  //全部被访问?yes: no
	for(int i=1;i<=n;i++)
		if (v1[i]==0) return false;
	return true;
}
bool dfs(int last,int i)//last是i顶点的父亲结点,从i顶点开始dfs
{
    v1[i] = true;       //访问i顶点
    ans[++length] = i;           //保存i到数组 
    for (int j = 1; j <= num[i]; j++)  { 
    	if (g[i][j]==start&&allvisited())  //**g[i][]数组,表示出i出发的点**
          {
  			ans[++length] = g[i][j];  
        	print();            
  			length--;
  		} 
		if (!v1[g[i][j]]) 
		  	if (dfs(i,g[i][j])) return true;
    }
    length--;
    v1[i] = false; 
    return false;
} 
int main(){

    memset(v1,false,sizeof(v1));
    cin>>n>>m;    //n个结点m条边
	for(int i=1;i<=m;i++){  
		int x,y;
		cin>>x>>y;
		g[x][++num[x]]=y;  //**从x出发的边放进二维数组,共num[x]条**
		g[y][++num[y]]=x;
	}
	start=1;
	dfs(1,start);  //从一号点开始深度优先搜索
    return 0;
}

/*第一个样例
4 5
1 2
1 3
1 4
2 3
2 4
两条哈密尔顿回路
1 3 2 4 1
1 4 2 3 1
哈密尔顿12面体的样例 20个点,30条边
20 30
1 2
1 5
1 14
2 3
2 12
3 10
3 4
4 5
4 8
5 6
6 7
6 15
7 8
7 17
8 9
9 10
9 18
10 11
11 12
11 19
12 13
13 14
13 20
14 15
15 16
16 17
16 20
17 18
18 19
19 20
¹þÃܶû¶Ù»Ø·
1 2 3 10 9 8 4 5 6 7 17 18 19 11 12 13 20 16 15 14 1
1 2 3 10 9 18 17 7 8 4 5 6 15 16 20 19 11 12 13 14 1
1 2 3 10 9 18 17 16 20 19 11 12 13 14 15 6 7 8 4 5 1
1 2 3 10 9 18 19 11 12 13 20 16 17 7 8 4 5 6 15 14 1
1 2 3 10 11 12 13 14 15 6 7 17 16 20 19 18 9 8 4 5 1
1 2 3 10 11 12 13 20 19 18 9 8 4 5 6 7 17 16 15 14 1
1 2 3 4 5 6 7 8 9 10 11 12 13 20 19 18 17 16 15 14 1
1 2 3 4 5 6 15 16 20 19 18 17 7 8 9 10 11 12 13 14 1
1 2 3 4 8 7 17 16 20 19 18 9 10 11 12 13 14 15 6 5 1
1 2 3 4 8 9 10 11 12 13 14 15 16 20 19 18 17 7 6 5 1
1 2 12 11 10 3 4 5 6 15 16 17 7 8 9 18 19 20 13 14 1
1 2 12 11 10 3 4 8 9 18 19 20 13 14 15 16 17 7 6 5 1
1 2 12 11 19 18 9 10 3 4 8 7 17 16 20 13 14 15 6 5 1
1 2 12 11 19 18 17 7 8 9 10 3 4 5 6 15 16 20 13 14 1
1 2 12 11 19 18 17 16 20 13 14 15 6 7 8 9 10 3 4 5 1
1 2 12 11 19 20 13 14 15 16 17 18 9 10 3 4 8 7 6 5 1
1 2 12 13 14 15 6 7 8 9 18 17 16 20 19 11 10 3 4 5 1
1 2 12 13 14 15 16 20 19 11 10 3 4 8 9 18 17 7 6 5 1
1 2 12 13 20 16 17 7 8 9 18 19 11 10 3 4 5 6 15 14 1
1 2 12 13 20 19 11 10 3 4 5 6 7 8 9 18 17 16 15 14 1
1 5 4 3 2 12 11 10 9 8 7 6 15 16 17 18 19 20 13 14 1
1 5 4 3 2 12 13 20 16 17 18 19 11 10 9 8 7 6 15 14 1
1 5 4 3 10 9 8 7 6 15 14 13 20 16 17 18 19 11 12 2 1
1 5 4 3 10 11 19 20 16 17 18 9 8 7 6 15 14 13 12 2 1
1 5 4 8 7 6 15 14 13 12 11 19 20 16 17 18 9 10 3 2 1
1 5 4 8 7 6 15 16 17 18 9 10 3 2 12 11 19 20 13 14 1
1 5 4 8 9 10 3 2 12 11 19 18 17 7 6 15 16 20 13 14 1
1 5 4 8 9 18 17 7 6 15 16 20 19 11 10 3 2 12 13 14 1
1 5 4 8 9 18 19 11 10 3 2 12 13 20 16 17 7 6 15 14 1
1 5 4 8 9 18 19 20 16 17 7 6 15 14 13 12 11 10 3 2 1
1 5 6 7 8 4 3 2 12 13 20 19 11 10 9 18 17 16 15 14 1
1 5 6 7 8 4 3 10 9 18 17 16 15 14 13 20 19 11 12 2 1
1 5 6 7 17 16 15 14 13 20 19 18 9 8 4 3 10 11 12 2 1
1 5 6 7 17 18 9 8 4 3 10 11 19 20 16 15 14 13 12 2 1
1 5 6 7 17 18 19 11 10 9 8 4 3 2 12 13 20 16 15 14 1
1 5 6 7 17 18 19 20 16 15 14 13 12 11 10 9 8 4 3 2 1
1 5 6 15 14 13 12 11 10 9 18 19 20 16 17 7 8 4 3 2 1
1 5 6 15 14 13 20 16 17 7 8 4 3 10 9 18 19 11 12 2 1
1 5 6 15 16 17 7 8 4 3 2 12 11 10 9 18 19 20 13 14 1
1 5 6 15 16 20 19 11 10 9 18 17 7 8 4 3 2 12 13 14 1
1 14 13 12 2 3 10 11 19 20 16 15 6 7 17 18 9 8 4 5 1
1 14 13 12 2 3 4 8 7 17 18 9 10 11 19 20 16 15 6 5 1
1 14 13 12 11 10 9 8 7 17 18 19 20 16 15 6 5 4 3 2 1
1 14 13 12 11 19 20 16 15 6 5 4 8 7 17 18 9 10 3 2 1
1 14 13 20 16 15 6 5 4 3 10 9 8 7 17 18 19 11 12 2 1
1 14 13 20 16 15 6 7 17 18 19 11 12 2 3 10 9 8 4 5 1
1 14 13 20 19 11 12 2 3 10 9 18 17 16 15 6 7 8 4 5 1
1 14 13 20 19 18 9 8 7 17 16 15 6 5 4 3 10 11 12 2 1
1 14 13 20 19 18 9 10 11 12 2 3 4 8 7 17 16 15 6 5 1
1 14 13 20 19 18 17 16 15 6 7 8 9 10 11 12 2 3 4 5 1
1 14 15 6 5 4 3 10 11 19 18 9 8 7 17 16 20 13 12 2 1
1 14 15 6 5 4 8 7 17 16 20 13 12 11 19 18 9 10 3 2 1
1 14 15 6 7 8 9 10 11 19 18 17 16 20 13 12 2 3 4 5 1
1 14 15 6 7 17 16 20 13 12 2 3 10 11 19 18 9 8 4 5 1
1 14 15 16 17 7 6 5 4 8 9 18 19 20 13 12 11 10 3 2 1
1 14 15 16 17 18 9 8 7 6 5 4 3 10 11 19 20 13 12 2 1
1 14 15 16 17 18 9 10 11 19 20 13 12 2 3 4 8 7 6 5 1
1 14 15 16 17 18 19 20 13 12 11 10 9 8 7 6 5 4 3 2 1
1 14 15 16 20 13 12 2 3 4 8 9 10 11 19 18 17 7 6 5 1
1 14 15 16 20 13 12 11 19 18 17 7 6 5 4 8 9 10 3 2 1

*/

1.问题一:这个程序对不对?我检查过是对的,您给看看?
2.为什么你上课只会打印出一条答案?

写回答

1回答

liuyubobobo

2020-10-28

1

目测没有问题。在 Leetcode 上有哈密顿回路(或者路径)的问题,你可以使用你的逻辑,试一下能否通过这些问题。比如这里:https://leetcode.com/problems/find-the-shortest-superstring/


2

因为在我的代码中,一旦找到一条回路,直接就返回了。


继续加油!:)

0
0

玩转算法系列--图论精讲(Java版)

30+小时系统学习,bobo带你克服被图论支配的恐惧

1591 学习 · 324 问题

查看课程