题目链接:点击打开链接
题意:给你一个图,判断这个图是不是连通且无环的。
使用并查集,查询时如果两个结点已经是一个集合里的了就说明有环。最后判断边数是不是等于点数-1(实际是个树)
代码:
#include <iostream>
#include <cstdio>
using namespace std;
int fa[100010];
bool vis[100010];
bool flag;
int m,n;
void init(){
for(int i=1;i<=100000;i++){
vis[i]=0;
fa[i]=i;
}
flag=0;
m=0;n=0;
}
int Find(int n){
while(n!=fa[n]){
n=fa[n];
}
return n;
}
int main(){
int x,y;
while(scanf("%d%d",&x,&y),x!=-1||y!=-1){
init();
while(x||y){
m++;
if(!vis[x]){vis[x]=1;n++;}
if(!vis[y]){vis[y]=1;n++;}
int a=Find(x);
int b=Find(y);
if(a==b) flag=1;
else fa[a]=b;
scanf("%d%d",&x,&y);
}
if(m!=n-1) flag=1;
if(m==0) flag=0;
if(flag) printf("No\n");
else printf("Yes\n");
}
return 0;
}