标签:
题意:给定一个邻接矩阵得到有向图,判断是否存在哈密顿回路,若存在,输出路径,否则输出-1;
思路:将每个点作为head遍历一次求哈密顿通路,看是否存在哈密顿回路;一个点的时候需要特判;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; int mm[1005][1005]; int nxt[500010]; int cnt[500010],ans; void solve(int start,int num){ int j,k; memset(nxt,-1,sizeof(nxt)); int head=start; for(int i=1;i<=num;i++){ if(i==start) continue; if(mm[i][head]){ nxt[i]=head; head=i; continue; } j=head; k=nxt[j]; while(k!=-1){ if(mm[j][i]&&mm[i][k]) break; j=k; k=nxt[j]; } nxt[j]=i; nxt[i]=k; } ans=0; while(head!=-1){ cnt[++ans]=head; head=nxt[head]; } } int main(){ int i,j,k,flag,u,v; while(scanf("%d",&n)!=EOF){ if(n==0) break; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ scanf("%d",&mm[i][j]); } } if(n==1){ printf("1\n");continue; } flag=1; for(i=1;i<=n;i++){ solve(i,n); if(!mm[cnt[n]][cnt[1]]) continue; for(j=1;j<=n;j++){ if(j==1) printf("%d",cnt[j]); else printf(" %d",cnt[j]); }printf("\n"); flag=0;break; } if(flag) printf("-1\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/dominating/p/4779415.html