#define N 2000 #include<cstdio> int father[N]; int height[N]; void Init(int n) { for (int i = 1; i <= n ; ++i) { father[i] = i ; height[i] = 1; } } int Find(int x) { if (x != father[x]) { father[x] = Find(father[x]); } return father[x]; } void Union(int x, int y, int& num) { x = Find(x); y = Find(y); if (x != y) { //原本不属于同一个联通子图 --num; } if (height[x] < height[y]) { father[x] = y ; } else if (height[x] > height[y]) { father[y] = x; } else { father[x] = y ; ++height[y]; } } int main() { int n, m ; while (scanf("%d%d", &n, &m) != EOF) { if (m == 0 && n == 0) { break; } Init(n); int num = n ;//最开始的联通子图数量 for (int i = 0 ; i < m ; ++i) { int x, y; scanf("%d%d", &x, &y); Union(x, y, num); } if (num == 1) { printf("YES\n"); } else { printf("NO\n"); } } }