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 }