程帅霞

不断受挫,不停起身,不断追寻,不止AC~~

导航

A - 欧拉回路

欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?

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 <cstring>
 3 #define maxn 1001
 4 #define inf 0x3f3f3f3f
 5 int pre[maxn],b[maxn];
 6 int find(int x)
 7 {
 8     return x==pre[x]?x:find(pre[x]);
 9 }
10 void merge(int x,int y)
11 {
12     int tx=find(x);
13     int ty=find(y);
14     if(tx!=ty)
15     {
16         pre[ty]=tx;
17     }
18 }
19 int main()
20 {
21     int n,m;
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 u,v;
30             scanf("%d%d",&u,&v);
31             b[u]++;
32             b[v]++;
33             merge(u,v);
34         }
35         int f=0,f1=0;
36         for(int i=1;i<=n;i++)
37         {
38             if(pre[i]==i) f1++;
39             if(b[i]%2) f++;//存在奇度点,说明是欧拉通路
40         }
41         if(f1==1&&f==0)
42         printf("1\n");
43         else
44         printf("0\n");
45     }
46 }

 

posted on 2020-08-12 17:38  程帅霞  阅读(128)  评论(0)    收藏  举报