问题描述 给定一个正整数n,有n个人,编号分别为0,1,2...n-1,刚开始每个人独立一只队伍。现在进行m次合并操作,把x和y所在的两只队伍合并。 现在想知道任意两人个人x和y是否在同一只队伍。 输入 输入第一行是一个正整数n(n<=100000). 第二行是一个正整数m(m<=100000)。 接下来m行每行两个正整数x和y(0<x,y<n),表示把x和y所在的队伍合并。 再接下来是一个正整数k,表示有k个查询。 最后k行每行两个正整数a和b(0<a,b<n),表示需要查询a和b是否在同一只队伍。 输出 输出总共k行,每个查询输出一行,如果a和b在同一只队伍输出yes,否则输出no。 c语言代码
时间: 2024-03-17 09:47:08 浏览: 81
delete--number.rar_K._delete namber_delete number_给定n位正整数
5星 · 资源好评率100%
以下是使用 C 语言实现的代码:
```c
#include <stdio.h>
int find(int x, int parent[])
{
if (parent[x] != x) {
parent[x] = find(parent[x], parent);
}
return parent[x];
}
int main()
{
int n, m, k, i, x, y, a, b;
scanf("%d%d", &n, &m);
// 初始化 parent 数组
int parent[n];
for (i = 0; i < n; i++) {
parent[i] = i;
}
// 合并操作
for (i = 0; i < m; i++) {
scanf("%d%d", &x, &y);
int px = find(x, parent), py = find(y, parent);
if (px != py) {
parent[px] = py;
}
}
scanf("%d", &k);
for (i = 0; i < k; i++) {
scanf("%d%d", &a, &b);
if (find(a, parent) == find(b, parent)) {
printf("yes\n");
} else {
printf("no\n");
}
}
return 0;
}
```
时间复杂度分析:
与 Python 实现类似,总时间复杂度为 $O(m+n\log n+k\log n)$,其中 $m$ 是合并操作的次数,$n$ 是节点数,$k$ 是查询的次数。
阅读全文