哈密尔顿环x
欧拉回路是指不重复地走过所有路径的回路,而哈密尔顿环是指不重复地走过所有的点,并且最后还能回到起点的回路。
代码如下:
#include<iostream> #include<cstring> using namespace std; const int Maxn=1001; int start,lengt,x,n; bool visited[Maxn],v1[Maxn]; int ans[Maxn],num[Maxn]; int g[Maxn][Maxn]; void print() { int i; for (i=1;i<=lengt;i++) cout<<ans[i]<<' '; cout<<endl; } void dfs(int last,int i) {//访问点i,last表示上次访问的点 visited[i]=1;//标记为已经访问过 v1[i]=1;//标记为已在一张图中出现过 ans[++lengt]=i;//记录下答案 for (int j=1;j<=num[i];j++) {//x为记录的第几个数 if (g[i][j]==x&&g[i][j]!=last) {//回到起点,构成哈密尔顿环 ans[++lengt]=g[i][j]; print();//如果找到了一个环,则输出ans数组 lengt--; break; } if (!visited[g[i][j]]) dfs(i,g[i][j]);//遍历与i相关联所有未访问过的顶点 } lengt--; visited[i]=0;//回溯,但需要注意的是v1的值不恢复 } int main() { cin>>n; int m; cin>>m; for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; g[x][++num[x]]=y;//表示x所对的第几个出度所指的数为y,说明xy之间能够“行走” g[y][++num[y]]=x;//同上 } for(x=1;x<=n;x++) //每一个点都作为起点尝试访问,因为不是从任何一点开始都能找过整个图的 if (!v1[x]) {//如果点x不在之前曾经被访问过的图里面的话 lengt=0;//定义一个ans数组存答案,lengt记答案的长度 dfs(0,x); } return 0; }