欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
- 输入:
-
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
- 输出:
-
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
- 样例输入:
-
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
-
//欧拉回路(无向图)经典解法:并查集+奇偶判断 (有向图也很简单,只要将Degree标志量拆分成inDegree和outDegree加之稍微变化一点的奇偶判断即可)
- 样例输出:
-
1 0
-
#include <iostream> #define MAX 1001 using namespace std; int Tree[MAX]; int Degree[MAX]; int findRoot(int x) { if(Tree[x]==-1) return x; else { int tmp = findRoot(Tree[x]); Tree[x] = tmp; return tmp; } } int main() { int N; int M; while(cin>>N,N!=0) { cin>>M; for(int i=1;i<=N;++i) { Tree[i]=-1; Degree[i]=0; } int a,b; while(M--) { cin>>a>>b; ++Degree[a]; ++Degree[b]; int x = findRoot(a); int y = findRoot(b); if(x!=y) { Tree[x] = y; } } int ans = 0; int flag = 1; for(int i=0;i<=N;++i) { if(Tree[i]==-1) ans++; if(Degree[i]%2==1) flag=0; } if(ans!=1) flag=0; cout<<flag<<endl; } // system("PAUSE"); return 0; }