哈密尔顿环路问题

来源:互联网 发布:制作搞笑图片软件 编辑:程序博客网 时间:2024/06/09 23:04

额的代码:

#include<stdio.h>#include<string.h>#define N 11int visit[N];int adj[N][N];int M;int path_OK(int cur,int hamilton[]){    if(visit[hamilton[cur]])    return 0;    if(cur<M)    return adj[hamilton[cur-1]][hamilton[cur]];    else    return adj[hamilton[M-1]][hamilton[M]]&&adj[hamilton[1]][hamilton[M]];}void dfs(int cur,int hamilton[]){    if(cur>M)    {        for(int i=1;i<=M;i++)        printf("%d ",hamilton[i]);        printf("\n");    }    else    {        for(int i=1;i<=M;i++)        {            hamilton[cur]=i;            if(path_OK(cur,hamilton))            {                visit[i]=1;                dfs(cur+1,hamilton);                visit[i]=0;            }        }    }}int main(){    memset(adj,0,sizeof(adj));    int B;int hal[N];    scanf("%d%d",&M,&B);int a,b;    for(int i=0;i<B;i++)        {            scanf("%d%d",&a,&b);            adj[a][b]=adj[b][a]=1;        }    hal[1]=1;visit[1]=1;//以其中一个点为起始点    dfs(2,hal);     return 1;} 

书上的回溯模板:(伪代码)

hamilton(adj,x){    x[1]=1    visit[1]=1    for i=2 to n        visit[i]=0;    rhamilton(adj,2,x)}                    rhamilton(adj,k,x){    for x[k]=2 to n        if(path_ok(adj,k,x)){            visit[x[k]]=1;            if(k==n||rhamilton(adj,k+1,x))            return 1;            visit[x[k]]=0        }        return 0}   path_ok(adj,k,x){    if(visit[x[k]])    return 0;    if(k<n)    return adj[x[k-1]][x[k]]    else    return adj[x[n-1]][x[n]]&&adj[x[n]][x[1]]}
0 0