哈密尔顿环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;
}

 

posted @ 2017-04-08 21:09  夜雨声不烦  阅读(210)  评论(0编辑  收藏  举报