想法很简单。每一组数组结束后,得到连线的个数cnt与数据中任意一个点所在的集合Q
如果Q中点的个数比cnt大1,证明恰好联通
注意若是一组数据只有0 0,输出Yes
#include<bits/stdc++.h>
using namespace std;
int house[100001],li[100001];
int fchain(int x){
int t=x;
while (t!=li[t])
{
t=li[t];
}
return t;
}
int main()
{
//freopen("C:\\Users\\Lenovo\\Desktop\\input.txt","r",stdin);
int a,b,cnt=0,x,y,tt=0;
set<int>aa;
for(int i=0;i<100001;i++)
{
house[i]=1;li[i]=i;
}
while (~scanf("%d%d",&a,&b))
{
if(a==b&&a==-1)break;
else if(a==b&&b==0)
{
if(cnt==0)
{
printf("Yes\n");
}
else{
if(house[tt]==cnt+1)printf("Yes\n");
else printf("No\n");
cnt=0,tt=0;aa.clear();
for(int i=0;i<100001;i++)
{
house[i]=1;li[i]=i;
}
}
}
else
{
aa.insert(a),aa.insert(b);
x=fchain(a);y=fchain(b);
cnt++;
if(x!=y)
{
li[x]=y;
house[y]+=house[x];
house[x]=0;
tt=y;
}
}
}
return 0;
}