zoj 1789 判汉密顿图

   先来区分几个概念:

    图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路

   具有欧拉回路的图称为欧拉图(简称E图)。

   欧拉回路的判断  一下判断基于此图的基图连通

无向图存在欧拉回路条件

  一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数。

有向图存在欧拉回路条件

  一个有向图存在欧拉回路,且所有顶点的入度等于出度

汉密尔顿定义:

给定图G,若存在一条路经过图中的每个结点恰好一次,这条路称作汉密尔顿路。若存在一条回路,经过图中的每个结点恰好一次,这条回路称作汉密尔顿回路。

汉密尔顿回路的判定,目前主流的就是用dfs了,此题刚好作为一个例子 ,无向图.

View Code
 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 using namespace std;
5 int map[100][100];
6 int user[100];
7 int n,flag,step;
8 void DFS(int x)
9 {
10 int i;
11 if(step==n&&map[x][0])
12 {
13 flag=1;return ;
14 }
15 if(flag)return ;
16 for (i=1;i<=n;i++)
17 if (!user[i]&&map[x][i])
18 {
19 user[i]=1;
20 step++;
21 DFS(i);
22 user[i]=0;
23 step--;
24 }
25 }
26 int main()
27 {
28 int x,i,j,k=0;
29 char ch;
30 while (scanf("%d",&n)&&n)
31 {
32 k++;
33 memset(map,0,sizeof(map));
34 memset(user,0,sizeof(user));
35 //getchar();
36 for (i=1;i<=n;i++)
37 {
38
39 cin>>x;
40 map[i][x]=1;
41 map[x][i]=1;
42 ch=getchar();
43 while (ch!='\n')
44 {
45 cin>>x;
46 map[i][x]=1;
47 map[x][i]=1;
48 ch=getchar();
49 }
50 }
51 flag=0;
52 DFS(0);
53 if(flag)
54 printf("Case %d: Granny can make the circuit.\n",k);
55 else printf("Case %d: Granny can not make the circuit.\n",k);
56
57 }
58 return 0;
59 }



转载于:https://www.cnblogs.com/zhaoguanqin/archive/2012/03/25/2416722.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值