题目背景
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
题目描述
规定:x 和 y 是亲戚,y 和 z 是亲戚,那么 x 和 z 也是亲戚。如果 x,y 是亲戚,那么 x 的亲戚都是 y 的亲戚,y 的亲戚也都是 x 的亲戚。
输入格式
第一行:三个整数 n,m,p,(n,m,p≤5000),分别表示有 n 个人,m 个亲戚关系,询问 p 对亲戚关系。
以下 m 行:每行两个数 M_i,M_j,1≤M_i, M_j≤N,表示 M_i 和 M_j 具有亲戚关系。
接下来 p 行:每行两个数 P_i,P_j,询问 P_i 和 P_j 是否具有亲戚关系。
输出格式
p 行,每行一个 Yes
或 No
。表示第 i 个询问的答案为“具有”或“不具有”亲戚关系。
输入输出样例
输入 #1
6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6
输出 #1
Yes
Yes
No
代码如下:
n, m, p = map(int, input().split())
lst = [i for i in range(n + 1)]
def find(x):
if lst[x] == x:
return x
else:
return find(lst[x])
def merge(x, y):
x1 = find(x)
y1 = find(y)
if x1 != y1:
lst[x1] = y1
for _ in range(m):
a, b = map(int, input().split())
merge(a, b)
for _ in range(p):
x, y = map(int, input().split())
if find(x) == find(y):
print('Yes')
else:
print('No')