描述
无向图,判断任意两个点能否有且仅有一条路径联通
(其实就是判断是不是一棵树)
解决
使用并查集
一条路:并查集合并过程中无冲突
任意两点:最后是不是只剩下一个集合
代码
#include<cstdio>
#include<set>
typedef long long LL;
const int N=1e5+10;
const int oo=0x3f3f3f3f;
using namespace std;
bool flag;
int fa[N];
set<int>all;
int find(int x){
if(fa[x]!=x)fa[x]=find(fa[x]);
return fa[x];
}
void join(int x,int y){
x=find(x);y=find(y);
if(x==y)flag=false;
else fa[x]=y;
}
int main(){
int x,y;
scanf("%d%d",&x,&y);
while(x!=-1&&y!=-1){
for(int i=0;i<N;i++)fa[i]=i;
flag=true;
all.clear();
while(x&&y){
all.insert(x);all.insert(y);
join(x,y);
scanf("%d%d",&x,&y);
}
int cnt=0;
for(auto i:all)
if(find(i)==i)cnt++;
if(cnt>1)flag=false;
if(flag)printf("Yes\n");
else printf("No\n");
scanf("%d%d",&x,&y);
}
return 0;
}