/*这段C代码使用了并查集(Union-Find)算法来判断给定的星球之间的航线是否存在环路。下面是代码的解释:
1. 首先定义了一个大小为MAX\_PLANETS的parent数组,用来存储每个星球的父节点。
2. 定义了find函数,用来找到某个星球的根节点(即所属集合的代表元素)。
3. 定义了unite函数,用来将两个星球所在的集合合并。
4. 在主函数main中,首先读入星球的数量n和航线的数量m。
5. 初始化每个星球的父节点为自身,即每个星球单独构成一个集合。
6. 依次读入每条航线的起点x和终点y,判断它们是否在同一个集合中:
* 如果不在同一个集合中,则将它们合并。
* 如果在同一个集合中,说明存在环路,输出"No"并结束程序。
7. 如果所有航线都被处理完毕后仍未输出"No",则说明不存在环路,输出"Yes"。
这段代码利用并查集的特性,通过不断合并集合的方式来判断是否存在环路,从而判断是否能够访问所有的星球。*/
#include <stdio.h>
#define MAX_PLANETS 10001
int parent[MAX_PLANETS];
int find(int x) {
if (parent[x] == x) {
return x;
}
return parent[x] = find(parent[x]);
}
void unite(int x, int y) {
x = find(x);
y = find(y);
if (x != y) {
parent[y] = x;
}
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
parent[i] = i;
}
int x, y;
for (int i = 0; i < m; i++) {
scanf("%d %d", &x, &y);
if (find(x) != find(y)) {
unite(x, y);
} else {
printf("No\n");
return 0;
}
}
printf("Yes");
return 0;
}