题目链接:传送门
哈密顿回路:
哈密顿通路(回路)与哈密顿图 (Hamilton图) 通过图G的每个结点一次,且仅一次的通路(回路),就是哈密顿通路(回路). 存在哈密顿回路的图就是哈密顿图·
对于这题我们直接暴力搜索一下就好了。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <set> #include <map> #include <queue> #define PB push_back #define MP make_pair #define REP(i,n) for(int i=0;i<(n);++i) #define FOR(i,l,h) for(int i=(l);i<=(h);++i) #define DWN(i,h,l) for(int i=(h);i>=(l);--i) #define IFOR(i,h,l,v) for(int i=(h);i<=(l);i+=(v)) #define CLR(vis) memset(vis,0,sizeof(vis)) #define MST(vis,pos) memset(vis,pos,sizeof(vis)) #define MAX3(a,b,c) max(a,max(b,c)) #define MAX4(a,b,c,d) max(max(a,b),max(c,d)) #define MIN3(a,b,c) min(a,min(b,c)) #define MIN4(a,b,c,d) min(min(a,b),min(c,d)) #define PI acos(-1.0) #define INF 1000000000 #define LINF 1000000000000000000LL #define eps 1e-8 #define LL long long using namespace std; const int maxn = 21; int mp[maxn][maxn]; int vis[maxn]; int path[maxn]; int m,cas; void dfs(int st,int cnt) { path[cnt]=st; if(cnt==20&&mp[st][m]) { printf("%d: ",cas++); for(int i=1; i<=20; i++) printf(" %d",path[i]); printf(" %d\n",m); } else { for(int i=1; i<=20; i++) { if(mp[st][i]&&!vis[i]) { vis[i]=1; dfs(i,cnt+1); vis[i]=0; } } } return; } int main() { CLR(mp); for(int i=1; i<=20; i++) { for(int j=0; j<3; j++) { int x; scanf("%d",&x); mp[i][x]=1; } } cas=1; while(~scanf("%d",&m)&&m) { if(m==0) break; CLR(vis); vis[m]=1; dfs(m,1); } return 0; }