【利用并查集检查图连通性】
不断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; }