N(1 \le N \le 1000)N(1≤N≤1000) 头奶牛,编号为 1\sim N1∼N,在参加一个喝茶时间活动。在喝茶时间活动开始之前,已经有 M(1 \le M \le 2,000)M(1≤M≤2,000) 对奶牛彼此认识(是朋友)。第 ii 对彼此认识的奶牛通过两个不相同的整数 A_iA i 和 B_iB i 给定( 1\le A_i \le N; 1 \le B_i \le N)1≤A i ≤N;1≤B i ≤N)。输入数据保证一对奶牛不会出现多次。 在喝茶时间活动中,如果奶牛 ii 和奶牛 jj 有一个相同的朋友奶牛 kk,那么他们会在某次的喝茶活动中去认识对方(成为朋友),从而扩大他们的社交圈。 请判断,在喝茶活动举办很久以后(直到没有新的奶牛彼此认识),Q(1 \le Q \le 100)Q(1≤Q≤100) 对奶牛是否已经彼此认识。询问 jj 包含一对不同的奶牛编号 X_jX j 和 Y_jY j (1 \le X_j \le N; 1 \le Y_j \le N)(1≤X j ≤N;1≤Y j ≤N)。 例如,假设共有 1\sim 51∼5 头奶牛,我们知道 22 号认识 55 号,22 号认识 33 号,而且 44 号认识 55 号;如下图(a)。 直接出C++代码
时间: 2023-02-19 19:09:45 浏览: 190
我可以为你提供 C 语言的代码来解决这个问题,你需要使用并查集来实现。
首先,我们需要初始化每个奶牛的编号,使每个奶牛的编号都是唯一的。然后,我们需要将所有 M 对彼此认识的奶牛加入到并查集中。最后,我们可以使用并查集的 find 函数来判断 Q 对奶牛是否已经彼此认识。
以下是 C 语言的代码:
```
#include <stdio.h>
#define MAXN 1000
int N, M, Q;
int A[MAXN + 1], B[MAXN + 1];
int parent[MAXN + 1]; // 并查集数组
int find(int x) {
if (parent[x] == x) {
return x;
}
return parent[x] = find(parent[x]);
}
int main() {
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; i++) {
parent[i] = i; // 初始化每个奶牛的编号
}
for (int i = 1; i <= M; i++) {
scanf("%d%d", &A[i], &B[i]);
int root1 = find(A[i]);
int root2 = find(B[i]);
if (root1 != root2) {
parent[root1] = root2; // 合并两个奶牛的编号
}
}
scanf("%d", &Q);
for (int i = 1; i <= Q; i++) {
int X, Y;
scanf("%d%d", &X, &Y);
int root1 = find(X);
int root2 = find(Y);
if (root1 == root2) {
printf("YES\n"); // 奶牛 X 和 Y 已经彼此认识
} else {
printf("NO\n"); // 奶牛 X 和 Y 还不认识
}
}
return 0;
}
```
在这段代码中,我们使用了一个
阅读全文