连接:http://acm.hdu.edu.cn/showproblem.php?pid=1272
意思很明确,查看树是否有环、
用到并查集。我又看了一遍并查集,有了一些了解。
小补充一些知识:
scanf的返回值由后面的参数决定
scanf("%d%d", &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF。
且返回值为int型.
&&(x!=0||y!=0)表示x,y都不为0
#include <IOSTREAM>
#include <CSTDIO>
using namespace std;
#define N 1001010
int father[N];
int number[N];
void init(void)
{
int i;
for (i=1;i<N;i++)
{
father[i]=i;
number[i]=0;
}
}
int Find(int a)
{
int b=a;
while(father[b]!=b)
b=father[b];
father[a]=b;
return father[a];
}
void Union(int a,int b)
{
a=Find(a);
b=Find(b);
father[a]=b;
}
int main()
{
int x,y,num,max,i,num2;
while(scanf("%d%d",&x,&y)==2&&x>=0)//最初是x>0,然后就答案错误,
{
num=0;
max=0;
num2=0;
init();
while(x!=0||y!=0)
{
num++;
number[x]=1;
number[y]=1;
Union(x,y);
scanf("%d%d",&x,&y);
}
for (i=1;i<N;i++)
{
if(number[i]==1)
max++;
if (father[i]==i&&number[i]==1)
{
num2++;
}
}
if(max==0)//注意n=0的情况
{
puts("Yes");
continue;
}
if(num2==1&&num==max-1)
puts("Yes");
else
puts("No");
}
return 0;
}