推荐学习资料:
http://www.cnblogs.com/Ash-ly/p/5452580.html
http://ylroki.blog.163.com/blog/static/162978871201032775322518/
https://wenku.baidu.com/view/38dd0d4714791711cd791725.html
一、定义
通过图G的每个节点一次,且仅一次的通路称为哈密顿通路
通过图G的每个节点一次,且仅一次的回路称为哈密顿回路
含有哈密顿回路的图称为哈密顿图
二、性质与判定
摘自:https://wenku.baidu.com/view/38dd0d4714791711cd791725.html
三、构造
摘自:http://ylroki.blog.163.com/blog/static/162978871201032775322518/
四、代码
输出哈密顿图的一条哈密顿回路
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 401 int n,m; bool e[N][N]; int cnt,s,t; bool vis[N]; int ans[N]; void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-‘0‘; c=getchar(); } } void Reverse(int i,int j) { while(i<j) swap(ans[i++],ans[j--]); } void expand() { while(1) { int i; for(i=1;i<=n;++i) if(e[t][i] && !vis[i]) { ans[++cnt]=t=i; vis[i]=true; break; } if(i>n) return; } } void Hamilton() { memset(vis,false,sizeof(vis)); cnt=0; s=1; for(t=1;t<=n;++t) if(e[s][t]) break; vis[s]=vis[t]=true; cnt=2; ans[1]=s; ans[2]=t; while(1) { expand(); Reverse(1,cnt); swap(s,t); expand(); if(!e[s][t]) { int i; for(i=2;i<cnt;++i) if(e[ans[i]][t] && e[s][ans[i+1]]) break; t=ans[i+1]; Reverse(i+1,cnt); } if(cnt==n) break; int j,i; for(j=1;j<=n;++j) if(!vis[j]) { for(i=2;i<cnt;++i) if(e[ans[i]][j]) break; if(e[ans[i]][j]) break; } s=ans[i-1]; Reverse(1,i-1); Reverse(i,cnt); ans[++cnt]=j; t=j; vis[j]=true; } for(int i=1;i<=cnt;++i) printf("%d ",ans[i]); printf("%d\n",ans[1]); } int main() { int u,v; while(1) { read(n); read(m); if(!n) return 0; memset(e,false,sizeof(e)); while(m--) { read(u); read(v); e[u][v]=e[v][u]=true; } Hamilton(); } }
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/8439160.html
时间: 2024-10-31 10:42:37