hdoj1272

来源:互联网 发布:云匠网的美工靠谱吗 编辑:程序博客网 时间:2024/06/05 02:58

连接: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 1001010int 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");elseputs("No");}return 0;}

原创粉丝点击