HDU4337 King Arthur's Knights【哈密顿回路】

来源:互联网 发布:以太网传输数据 编辑:程序博客网 时间:2024/04/28 11:06

题意:输出一条哈密顿回路


思路:由于每个点的度大于等于(N+1)/ 2,所以一定存在,用一下模板


#include<stdio.h>#include<iostream>#include<string.h>#include<string>#include<stdlib.h>#include<math.h>#include<vector>#include<list>#include<map>#include<stack>#include<queue>#include<algorithm>#include<numeric>#include<functional>using namespace std;typedef long long ll;const int maxn = 155;int n;bool G[maxn][maxn];  int x[maxn];//记录回路中的第i个点  void init(){memset(G,0,sizeof G);}void hamilton(){       bool s[maxn];    for(int i = 0; i < n; i++){          x[i] = -1;          s[i] = false;      }    int k = 1;      s[0] = true;      x[0] = 0;     while(k >= 0){        x[k]++;          while(x[k] < n){              if(!s[x[k]] && G[x[k - 1]][x[k]])                  break;              else                  x[k]++;          }        if((x[k] < n) && (k != n - 1)){              s[x[k++]] = true;          }          else if( (x[k] < n) && k == n - 1 && G[x[k]][x[0]] )              break;          else{              x[k] = -1;              k--;              s[x[k]] = false;          }      }  }//hamilton函数中下标从0开始int main(void){int m,i;while(scanf("%d %d",&n,&m)!=EOF){init();while(m--){int a,b;scanf("%d%d",&a,&b);a--;b--;G[a][b] = G[b][a] = 1;}hamilton();for(i = 0; i < n; i++)printf("%d%c",x[i]+1,i==n-1?'\n':' ');}return 0;}


原创粉丝点击