1
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int f[1100],d[1100];
int find(int x)
{
if(x==f[x])
return x;
else
{
f[x]=find(f[x]);
return f[x];
}
}
void unio(int a,int b)
{
int nx=find(a);
int ny=find(b);
if(nx!=ny)
f[ny]=nx;
}
int main()
{
int n,m,a,b;
while(~scanf("%d",&n),n)
{
scanf("%d",&m);
memset(d,0,sizeof(d));
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
d[a]++;
d[b]++;
unio(a,b);
}
int root=0;
for(int i=1;i<=n;i++)
{
if(f[i]==i)
root++;
}
if(root!=1)
{
printf("0\n");
continue;
}
int faut=1;
for(int i=1;i<=n;i++)
{
if(d[i]%2!=0)
{faut=0;
break;
}
}
if(faut==1)
printf("1\n");
else
printf("0\n");
}
return 0;
}
下面是稍作修改的
#include<stdio.h>
#include<string.h>
//#include<algorithm>
//using namespace std;有这两行也报错,哎╮(╯▽╰)╭
int f[1100];
int d[1100];
int rand[1100];
int find(int x)//寻根
{
if(x==f[x])
return x;
else
{
f[x]=find(f[x]);
return f[x];
}
}
void unio(int a,int b)//合并
{
int nx=find(a);
int ny=find(b);
if(rand[nx]>rand[ny]) //有时候是f[nx]=ny而有时候是f[ny]=nx,傻傻分不清楚,后来知道可以按秩合并
f[ny]=nx; //秩即树的高度
else
{
f[nx]=ny;
if(rand[nx]==rand[ny])
rand[ny]++;
}
}
int main()
{
int n,m,a,b;
while(~scanf("%d",&n),n)
{
scanf("%d",&m);
memset(d,0,sizeof(d));//数组清零
for(int i=1;i<=n;i++)
f[i]=i;//节点初始化,开始自己是自己的跟
for(int i=1;i<=m;i++)
{ rand[i]==0;//觉得这里应该是=,不知道为啥改成=就不对了。。。
scanf("%d%d",&a,&b);
d[a]++;//记录每个点度数
d[b]++;
unio(a,b);
}
int root=0;
for(int i=1;i<=n;i++)
{
if(f[i]==i)
root++;
}
if(root!=1)//最后只有一个根节点
{
printf("0\n");
continue;//进入下一组数据
}
int faut=1;
for(int i=1;i<=n;i++)
{
if(d[i]%2!=0)//欧拉回路每个点的度数都是偶数
{faut=0;
break;
}
}
if(faut==1)
printf("1\n");
else
printf("0\n");
}
return 0;
}