欧拉回路
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
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 #include <algorithm> 4 using namespace std; 5 int pre[1001],b[1001]; 6 int n,m; 7 int find(int x) 8 { 9 return x=pre[x]?x:find(pre[x]); 10 } 11 void merge(int x,int y) 12 { 13 int tx=find(x); 14 int ty=find(y); 15 if(tx!=ty) 16 { 17 pre[tx]=ty; 18 } 19 } 20 int main() 21 { 22 while(~scanf("%d",&n)&&n) 23 { 24 memset(b,0,sizeof(b)); 25 for(int i=1;i<=n;i++) pre[i]=i; 26 scanf("%d",&m); 27 for(int i=1;i<=m;i++) 28 { 29 int x,y; 30 scanf("%d%d",&x,&y); 31 merge(x,y); 32 b[x]++; 33 b[y]++; 34 } 35 int f=0,g=0; 36 for(int i=1;i<=n;i++) 37 { 38 if(pre[i]==i) 39 g++; 40 if(b[i]%2!=0) 41 { 42 f=1; 43 break; 44 } 45 } 46 if(g==1&&!f) printf("1\n"); 47 else printf("0\n"); 48 } 49 }