题目分析: 题目的意思就是判断一个图中的每两个点是否连同,且图中没有回路
算法分析:先用并查集判断这个图是不是有多个连通块,然后只需判断 边数是否等于顶点数-1 即可,这个题有一个比较坑的点就是 当输入为 0 0 的时候 也要输出 Yes
代码:
#include <cstdio>
#include <cstring>
int bin[100005];
int used[100005];
int edge;
int findx(int x)
{
int r=x;
while (bin[r]!=r)
r=bin[r];
return r;
}
void merge(int x,int y)
{
int fx,fy;
fx=findx(x);
fy=findx(y);
if (fx!=fy)
bin[fx]=fy;
}
int main()
{
//freopen("1.txt","r",stdin);
int num,maxn;
int sum;
int a,b;
while (scanf("%d%d",&a,&b)==2 && a!=-1 && b!=-1)
{
if (a==0 && b==0)
{
printf("Yes\n");
continue;
}
memset(used,0,sizeof(used));
maxn=-1;
num=0;
sum=0;
for (int i=1;i<=100004;i++)
bin[i]=i;
edge=1;
if (a>maxn) maxn=a;
if (b>maxn) maxn=b;
used[a]=1;
used[b]=1;
merge(a,b);
while (scanf("%d%d",&a,&b)==2 && a!=0 && b!=0)
{
merge(a,b);
if (a>maxn) maxn=a;
if (b>maxn) maxn=b;
used[a]=1;
used[b]=1;
edge++;
}
for (int i=1;i<=maxn;i++)
if (used[i]==1)
{
// printf("%d ",i);
sum++;
}
// printf("\n");
for (int i=1;i<=sum;i++)
if (bin[i]==i && used[i]==1) num++;
// printf("num=%d ",num);
// printf("edge=%d ",edge);
// printf("sum=%d \n",sum);
if (num!=1) printf("No\n");
else
{
if (edge==sum-1) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}