码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 3414 Tour Route(哈密顿回路判定)

时间:2015-09-02 21:53:05      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

题意:给定一个邻接矩阵得到有向图,判断是否存在哈密顿回路,若存在,输出路径,否则输出-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;
}

 

hdu 3414 Tour Route(哈密顿回路判定)

标签:

原文地址:http://www.cnblogs.com/dominating/p/4779415.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!