并查集

#include <iostream>
#include <cstdio>
using namespace std;
#define _for(i, a, b) for(int i = a; i <= b; ++i)

const int N = 1010;
int father[N];
int ranks[N];

int findFather(int x){
    int a = x;
    while(father[x] != -1){
        x = father[x];
    }
    while(father[a] != -1){
        int z = a;
        a = father[a];
        father[z] = x;
    }
    return x;
}

void Union(int a, int b){
    int faA = findFather(a), faB = findFather(b);
    if(faA == faB) return;
    if(ranks[faA] < ranks[faB]){
        father[faA] = faB;
    }else if(ranks[faB] < ranks[faA]){
        father[faB] = faA;
    }else{
        father[faA] = faB;
        ++ranks[faB];
    }
}
bool check(int n){
    int cnt = 0;
    _for(i, 1, n){
        if(father[i] == -1){
            ++cnt;
        }
    }
    return cnt == 1;
}
int main(){
    int n, m;
    while(~scanf("%d %d", &n, &m) && n && m){
        _for(i, 1, n){
            father[i] = -1;
            ranks[i] = 1;
        }        
        while(m--){
            int x, y;
            scanf("%d %d", &x, &y);
            Union(x, y);
        }
        check(n) ? printf("YES\n") : printf("NO\n");
    }
    return 0;
}