【利用并查集检查图连通性】
不断Union,然后检查getRoot(i)==i有多少个即有多少极大连通子图
#include<iostream>
using namespace std;
int parent[1001];
void init(int n){
for(int i=0;i<n;i++){
parent[i] = i;
}
}
int getRoot(int i){
while(parent[i]!=i){
i = parent[i];
}
return i;
}
void unionTree(int a,int b){
int root_a = getRoot(a);
int root_b = getRoot(b);
parent[root_a] = root_b;
}
int main(){
int nodes,edges;
int x,y;
while(cin>>nodes>>edges){
if(nodes==0&&edges==0) break;
init(nodes);
for(int i=0;i<edges;i++){
cin>>x>>y;
unionTree(x,y);
}
int counter = 0;
for(int i=0;i<nodes;i++){
if(getRoot(i)==i) counter++;
}
if(counter==1){
cout<<"YES"<<endl;
} else {
cout<<"NO"<<endl;
}
}
return 0;
}

京公网安备 11010502036488号