/*这段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; }