cpp
复制代码
#include<iostream>
#include<vector>
using namespace std;
int parent[100005];//记录每个点的根
int rank_[100005];//记录集合的高度
//并查集初始化
void init(int n){
for(int i=1;i<=n;i++){
parent[i]=i;//每个点的父节点初始化为自己
rank_[i]=1;//初始时所有树的高度为1
}
}
//找到x的根,并压缩
int find(int x){
if(parent[x]!=x)
parent[x]=find(parent[x]);//路径压缩,使x直接指向根
return parent[x];
}
//合并x和y的集合
void union_sets(int x,int y){
int rootx=find(x);
int rooty=find(y);
if(rootx!=rooty){
if(rank_[rootx]>rank_[rooty])
parent[rooty] = rootx;
else if(rank_[rootx] < rank_[rooty])
parent[rootx] = rooty;
else{
parent[rooty] = rootx;
rank_[rootx]++;
}
}
}
int main(){
int n,m;
while((scanf("%d %d",&n,&m))!=EOF){
init(n);
for(int i=0;i<m;i++){
int x,y;
cin >> x >> y;
union_sets(x,y);
}
int root=find(1);
bool connected = true;
for(int i=2;i<=n;i++){
if(find(i)!=root){
connected=false;
break;
}
}
cout << (connected?"YES":"NO") << endl;
}
return 0;
}