HDU 2181 哈密顿绕行世界问题 (求一个图的所有哈密顿回路)

题目链接:传送门

哈密顿回路:

哈密顿通路(回路)与哈密顿图 (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 longusing 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;}

,敢于奋斗的人,心中不怕困难。

HDU 2181 哈密顿绕行世界问题 (求一个图的所有哈密顿回路)

相关文章:

你感兴趣的文章:

标签云: