问题 A: 通信系统
#include<cstdio>
#include<algorithm>
const int maxn = 10010;
int father[maxn];
bool isRoot[maxn];
void Init(int n) {
for (int i = 1; i <= n; i++) {
father[i] = i;
isRoot[i] = false;
}
}
int getfather(int x) {
int a = x;
while (father[x] != x) {
x = father[x];
}
while (father[a] != a) {
int v = a;
a = father[a];
father[v] = x;
}
return x;
}
int Union(int a, int b) {
int fathera = getfather(a);
int fatherb = getfather(b);
if (fathera != fatherb) {
father[fathera] = fatherb;
return 0;
}
else return 1;
}
int main() {
int n, m;
int a, b;
int count;
int flag;
while (scanf("%d %d", &n, &m), n != 0 || m != 0) {
Init(n);
flag = 0;
for (int i = 0; i < m; i++) {
scanf("%d %d", &a, &b);
if (Union(a, b) == 1) {
flag = 1;
}
}
count = 0;
for (int i = 1; i <= n; i++) {
isRoot[getfather(i)] = true;
}
for (int i = 1; i <= n; i++) {
count += isRoot[i];
}
if (count == 1&&flag==0) {
printf("Yes\n");
}
else {
printf("No\n");
}
}
}