先来区分几个概念:
图G的一个回路,若它恰通过G中每条边一次,则称该回路为欧拉(Euler)回路。
具有欧拉回路的图称为欧拉图(简称E图)。
欧拉回路的判断 一下判断基于此图的基图连通。
无向图存在欧拉回路条件
一个无向图存在欧拉回路,当且仅当该图所有顶点度数都是偶数。
有向图存在欧拉回路条件
一个有向图存在欧拉回路,且所有顶点的入度等于出度
汉密尔顿定义:
给定图G,若存在一条路经过图中的每个结点恰好一次,这条路称作汉密尔顿路。若存在一条回路,经过图中的每个结点恰好一次,这条回路称作汉密尔顿回路。
汉密尔顿回路的判定,目前主流的就是用dfs了,此题刚好作为一个例子 ,无向图.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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 }