1.题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1272
2.思路:
并查集判断连通性,要注意0 0这数据的结果是Yes,还有边数=点数-1,那个查找的函数不要用递归,不然会RE,Orz~~~
3.参考代码:
#include <stdio.h>
#include <string.h>
#define N 100005
int root[N];
int vis[N];
int flag;
int find(int x){ ///用递归就RE了,难道栈爆掉了?
// if(x==root[x])
// return x;
// return root[x]=find(root[x]);
while(x!=root[x])
x=root[x];
return x;
}
void merge(int x,int y){
int a=find(x);
int b=find(y);
if(a!=b)
root[a]=b;
else
flag=0; ///同根节点,即成环
}
int main()
{
int i,a,b;
while(~scanf("%d%d",&a,&b))
{
if(a==-1 && b==-1)
break;
if(a==0 && b==0)
{
printf("Yes\n");
continue;
}
for(i=0;i<N;i++)
{
root[i]=i;
vis[i]=0;
}
flag=1;
merge(a,b);
vis[a]=vis[b]=1;
while(~scanf("%d%d",&a,&b))
{
if(a==0 && b==0)
break;
merge(a,b);
vis[a]=vis[b]=1;
}
int ans=0;
for(i=0;i<N;i++)
{
if(root[i]==i && vis[i]) ///判断根节点的数目
ans++;
if(ans>1)
flag=0;
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}