题目链接
题意
给定若干边,问涉及到的点能否构成一个联通的,每两点间道路唯一的图
思路
并查集模版,每次接受u,v看uv是否在同一集合内,在的话两点间道路就不唯一了,不在就连接。
注意两点,一是最终需要是连通图,也就是 1 2 3 4 0 0这样的数据是No。二是没有边,也就是0 0的数据是Yes。
代码
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
using namespace std;
typedef long long ll;
const int maxn=100500;
const int inf=0x3f3f3f3f;
int n,m,q;
int fa[maxn];
bool uesd[maxn];
int cnt,id;
void init(){
for(int i=0;i<maxn;i++){
fa[i]=i;
}
}
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
void unite(int u,int v){
int fx=find(u),fy=find(v);
if(fx==fy)
return ;
fa[fx]=fy;
return ;
}
int main(){
IOS
int a,b;
bool ans=0;
init();
while(cin>>a>>b){
if(a==-1&&b==-1)
break;
if(!a&&!b){
for(int i=1;i<maxn;i++){
if(uesd[i]){
if(!cnt){
cnt++;
id=find(i);
}
else{
if(find(i)!=id)
cnt++;
}
}
}
if(cnt>1)
ans=1;
if(ans)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
ans=0;
init();
memset(uesd,0,sizeof uesd);
cnt=0,id=0;
continue;
}
uesd[a]=uesd[b]=1;
int fx=find(a),fy=find(b);
if(fx==fy)
ans=1;
else
unite(a,b);
}
}