用c++实现欧拉回路的寻找(杭电ACM)
2012-05-01 23:09
603 查看
Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
Sample Input
Sample Output
实现代码为:
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
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
实现代码为:
#include <iostream> using namespace std; const int SIZE = 1001; bool map[SIZE][SIZE]; bool visited[SIZE]; int degree[SIZE]; void Dfs(int n, int i); int main() { int node, edge, start, over, i; bool adj, euler; while(cin >> node && node) { scanf("%d", &edge); adj = euler = true; memset(degree, 0, sizeof(degree)); memset(map, 0, sizeof(map)); memset(visited, 0, sizeof(visited)); for(i=0;i<edge;i++) { scanf("%d %d", &start, &over); map[start][over] = map[over][start] = true; degree[start]++; degree[over]++; } for(i=1;i<=node;i++) if(!visited[i]) Dfs(node, start); for(i=1;i<=node;i++) if(!visited[i]) { adj = false; break; } for(i=1;i<=node;i++) if(1 == degree[i]%2) { euler = false; break; } if(adj && euler) printf("1\n"); else printf("0\n"); } return 0; } void Dfs(int n, int i) { int j; visited[i] = true; for(j=1;j<=n;j++) if(map[i][j] && !visited[j]) Dfs(n, j); }
相关文章推荐
- 杭电ACM 2015 偶数求和 算法分析详解 C++实现
- ACM程序设计,找出可疑串,并删除可疑串,用C++实现
- 寻找字符串中首次出现的不重复字符算法与c++实现
- ACM气球膨胀问题C++实现
- 【C++ STL应用与实现】0: 感恩STL——STL, ACM和年轻的我们
- ACM小明的数学题Ⅰ C++实现
- C++实现爱拉托斯散筛法寻找素数
- ACM--括号匹配C++实现
- ACM小明的数学题ⅡC++实现
- 杭电ACM 1005(Number Sequence)c++
- 寻找第k大或第k小的算法 -- 内存足够(C++实现)
- 动态规划C++::杭电ACM1003
- PKU ACM 1002 487-3279 C++实现
- acm 输入输出处理入门 A+B(I) C++实现
- ACM成对的字符串(C++实现)
- ACM 重构二叉树 C++实现
- ACM唯一的最小生成树C++实现
- 寻找递增的三元子序列——C++实现
- ACM零件C++实现
- ACM非前缀编码 C++实现