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