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<cstdio> 2 #include<string.h> 3 int n,m,cnt,key,a,b,fa[1010],d[1010],i; 4 int find(int a) 5 { 6 if(a == fa[a]) 7 { 8 return a; 9 } 10 else 11 { 12 return fa[a]=find(fa[a]); 13 } 14 } 15 void f1(int x,int y) 16 { 17 int nx,ny; 18 nx=find(x); 19 ny=find(y); 20 if(nx != ny) 21 { 22 fa[ny]=nx; 23 } 24 } 25 int main() 26 { 27 while(scanf("%d",&n) && n) 28 { 29 memset(d,0,sizeof(d)); //数组清零 30 for(i = 1 ; i <= n ; i++) 31 { 32 fa[i]=i; 33 } 34 scanf("%d",&m); 35 for(i = 0 ; i < m ; i++) 36 { 37 scanf("%d %d",&a,&b); 38 d[a]++; 39 d[b]++; //记录每个点的度数 40 f1(a,b); 41 } 42 cnt=0;key=0; 43 for(i = 1 ; i<= n ; i++) 44 { 45 if(d[i] % 2) //判断每个点都是偶度 46 { 47 key=1; 48 } 49 if(i == fa[i]) //判断没有独立的点 50 { 51 cnt++; 52 } 53 } 54 if(cnt == 1) //没有独立的点 55 { 56 if(key == 0) //每个点的度数都是偶数 57 { 58 printf("1\n"); 59 } 60 else 61 { 62 printf("0\n"); 63 } 64 } 65 else 66 { 67 printf("0\n"); 68 } 69 } 70 }
时间: 2024-10-02 10:31:36