zoj 1789 判汉密顿图
2012-03-25 15:46
351 查看
先来区分几个概念:
图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。具有欧拉回路的图称为欧拉图(简称E图)。
欧拉回路的判断 一下判断基于此图的基图连通。
无向图存在欧拉回路条件
一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数。有向图存在欧拉回路条件
一个有向图存在欧拉回路,且所有顶点的入度等于出度
汉密尔顿定义:
给定图G,若存在一条路经过图中的每个结点恰好一次,这条路称作汉密尔顿路。若存在一条回路,经过图中的每个结点恰好一次,这条回路称作汉密尔顿回路。
汉密尔顿回路的判定,目前主流的就是用dfs了,此题刚好作为一个例子 ,无向图.
View Code
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int map[100][100]; int user[100]; int n,flag,step; void DFS(int x) { int i; if(step==n&&map[x][0]) { flag=1;return ; } if(flag)return ; for (i=1;i<=n;i++) if (!user[i]&&map[x][i]) { user[i]=1; step++; DFS(i); user[i]=0; step--; } } int main() { int x,i,j,k=0; char ch; while (scanf("%d",&n)&&n) { k++; memset(map,0,sizeof(map)); memset(user,0,sizeof(user)); //getchar(); for (i=1;i<=n;i++) { cin>>x; map[i][x]=1; map[x][i]=1; ch=getchar(); while (ch!='\n') { cin>>x; map[i][x]=1; map[x][i]=1; ch=getchar(); } } flag=0; DFS(0); if(flag) printf("Case %d: Granny can make the circuit.\n",k); else printf("Case %d: Granny can not make the circuit.\n",k); } return 0; }
相关文章推荐
- zoj - 1789 - The Suspects
- zoj 2158 poj 1789 Truck History (Prim)
- ZOJ1789(The Suspects)j简单并查集
- zoj 1789 The Suspects
- zoj 1789 The Suspects
- zoj 1789 The Suspects
- zoj 1789
- ZOJ 2158 && POJ 1789 Truck History (经典MST)
- Truck History POJ 1789 ZOJ 2158 Prim算法
- zoj1789(并查集)
- ZOJ 1789
- ZOJ 1789 水水的并查集,刚开始学会并查集,做了此题。经过一次失败后终于AC了哈哈~ AC感觉就是好啊!与大家共分享啊
- zoj 1789 The Suspects
- zoj 1789 The Suspects
- zoj 1789||poj 1611 The Suspects(并查集,简单)
- ACM zoj 1789(并查集实现)
- zoj 1789 The Suspects
- zoj-1789
- ZOJ-1789
- zoj1789-The Suspects