您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: