HDU 1878 欧拉回路(DFS)

欧拉回路

            Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

                   Total Submission(s): 7721    Accepted Submission(s): 2729

Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
 
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结 束。
 
Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
 
Sample Input
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
 
Sample Output
1
0
 
 
 
判断欧拉回路是否存在方法
  有向图:图连通,所有顶点出度等于入度。
  无向图:图连通,所有定点都是偶数度。
 
 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int   N, M, st, et;
 5 const int MAX_NUM = 1005;
 6 int   visit[MAX_NUM];
 7 int   maze[MAX_NUM][MAX_NUM];
 8 int   degree[MAX_NUM];
 9 bool  bResult;
10 int   startPoint;
11 
12 void dfs(int mark, int curNum)          //mark表示到达第几个点,curNum表示当前点
13 {
14     if(bResult)return ;
15     if(mark==N+1 && curNum==startPoint) //遍历所有点且又回到出发点
16     {
17         bResult = true;
18         return ;
19     }
20 
21     for(int k=1; k<=N; k++)
22     {
23         if(visit[k]==0 && maze[curNum][k]==1)
24         {
25             visit[k] = 1;
26             dfs(mark+1, k);
27             visit[k] = 0;
28         }
29     }
30 }
31 
32 int main()
33 {
34     while(scanf("%d", &N) && N)
35     {
36         bResult = false;
37         memset(maze, 0, sizeof(maze));
38         memset(visit, 0, sizeof(visit));
39         memset(degree, 0, sizeof(degree));
40         scanf("%d", &M);
41         while(M--)
42         {
43             scanf("%d %d", &st, &et);
44             degree[st]++;                 //记录点的度数
45             degree[et]++;
46             maze[st][et] = maze[et][st] = 1;
47         }
48         bool bFlag = true;
49         for(int k = 1; k <= N; k++)
50         {
51             if(degree[k] % 2 == 1)        //若存在点的度数不是偶数度,则不存在欧拉回路
52             {
53                 bFlag = false;
54                 break;
55             }
56         }
57         if(!bFlag)
58         {
59             printf("0\n");
60             continue;
61         }
62         for(int k = 1; k <= N; k++)
63         {
64             if(bResult)break;
65             startPoint = k;              //记录开始出发点startPoint
66             dfs(1, k);
67         }
68         if(bResult)
69             printf("1\n");
70         else
71             printf("0\n");
72     }
73     return 0;
74 }
原文地址:https://www.cnblogs.com/Dreamcaihao/p/3108876.html