//土尔逊Torson 编写于2023/06/16 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> using namespace std; const int MAXN12701 = 1000; int father12701[MAXN12701]; //父亲结点 int height12701[MAXN12701]; //结点高度 void Initial12701(int n) { //初始化 for (int i = 0; i <= n; i++) { father12701[i] = i; //每个结点的父亲为自己 height12701[i] = 0; //每个结点的高度为零 } } int Find12701(int x) { //查找根结点 if (x != father12701[x]) { //路径压缩 father12701[x] = Find12701(father12701[x]); } return father12701[x]; } void Union12701(int x, int y) { x = Find12701(x); y = Find12701(y); if (x != y) { if (height12701[x] < height12701[y]) { father12701[x] = y; } else if (height12701[y] < height12701[x]) { father12701[y] = x; } else { father12701[y] = x; height12701[x]++; } } return; } int main() { int n, m; while (scanf("%d", &n) != EOF) { if (n == 0) { break; } scanf("%d", &m); Initial12701(n); //初始化 while (m--) { int x, y; scanf("%d", &x); scanf("%d", &y); Union12701(x, y); //合并集合 } int component = 0; //连通分量 for (int i = 1; i <= n; i++) { if (Find12701(i) == i) { //集合数目 component++; } } if (component == 1) { printf("YES\n"); } else { printf("NO\n"); } } system("pause"); return EXIT_SUCCESS; } // 64 位输出请用 printf("%lld")