题目来源:码蹄集
题目描述:
Python代码实现:
n = int(input())
fa = [i for i in range(2 * 10 ** 4 + 7)]
def find(x):
if x == fa[x]:
return x
fa[x] = find(fa[x])
return fa[x]
for _ in range(n):
a, b = map(int, input().split())
fa[find(b)] = find(a)
q = int(input())
for _ in range(q):
a, b = map(int, input().split())
if find(a) == find(b):
print(1)
else:
print(0)
Java代码实现:
import java.util.Scanner;
public class Main {
private static int[] fa;
private static int find(int x) {
if (x == fa[x]) {
return x;
}
fa[x] = find(fa[x]);
return fa[x];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
fa = new int[2 * 10000 + 7];
for (int i = 1; i < fa.length; i++) {
fa[i] = i;
}
for (int i = 0; i < n; i++) {
int a = sc.nextInt(), b = sc.nextInt();
fa[find(b)] = find(a);
}
int q = sc.nextInt();
for (int i = 0; i < q; i++) {
int a = sc.nextInt(), b = sc.nextInt();
System.out.println(find(a) == find(b) ? 1 : 0);
}
sc.close();
}
}
C++代码实现:
代码来源B站up主轩哥码题:https://www.bilibili.com/video/BV1cs4y137za/?t=200.5
#include <bits/stdc++.h>
using namespace std;
const int N = 2e4 + 7;
int fa[N], n, q, a, b;
void init(int n) {
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
}
int find(int x) { //查找
return x == fa[x] ? x : (fa[x] = find(fa[x])); //路径压缩
}
int main() {
cin >> n;
init(N);
while (n--) {
cin >> a >> b;
fa[b] = a;
}
cin >> q;
while (q--) {
cin >> a >> b;
if (find(a) == find(b)) {
cout << "1" << endl;
} else {
cout << "0" << endl;
}
}
return 0;
}