Date: 2023年1月11日
Author: 小 y 同 学
Classify: 蓝桥杯每日一练
Language: Python
题意
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任 意给出的两个人是否具有亲戚关系。规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是 y的亲戚,y的亲戚也都是x的亲戚。输入格式
第一行:三个整数m,n,p,( m , n , p ≤ 5000 m,n,p\le 5000 m,n,p≤5000),分别表示又n个人,m个亲戚关系,询问p对亲戚关系。
以下m行:每行两个数 M i M_i Mi, M j M_j Mj , 1 ≤ M i , M j ≤ N 1\le M_i,M_j\le N 1≤Mi,Mj≤N ,表示 M i M_i Mi和 M j M_j Mj具有亲戚关系。
接下来p行:每行两个数 P i , P j P_i,P_j Pi,Pj,询问 P i P_i Pi和 P j P_j Pj是否具有亲戚关系。输出格式
p行,每行一个Yes
或No
。表示第i个询问的答案为“具有”或“不具有”亲戚关系。样例输入
6 5 3 1 2 1 5 3 4 5 2 1 3 1 4 2 3 5 6
- 样例输出
Yes Yes No
数据输入
本题主要是使用并查集的模板来解题,对于n,m,p的输入
n, m, p = map(int, input().strip().split())
随后使用循环将m个亲戚关系合并,再使用循环查找p次询问。核心处理
主要是使用并查集的模板来进行解题:先使用列表推导式初始化,然后使用合并模板将亲戚关系进行处理,最后使用路径压缩的查询模板查找询问的两个父节点,一致则说明他们具有亲戚关系。
# _*_coding:utf-8_*_ # created by cy on 2023/1/11 # 查询,路径压缩 def find(x): if x == fa[x]: return x else: fa[x] = find(fa[x]) # 路径压缩 return fa[x] # x,y合并 def union(x, y): x_fa = find(x) # x祖先 y_fa = find(y) # y祖先 fa[x_fa] = y_fa # x祖先指向y祖先 # n个人,m个关系,p个询问 n, m, p = map(int, input().strip().split()) fa = [i for i in range(n + 1)] # 初始化 for i in range(m): # 合并 x_, y_ = map(int, input().split()) union(x_, y_) for j in range(p): # 询问 x_, y_ = map(int, input().split()) if find(x_) == find(y_): print('Yes') else: print('No')
小y的今日一练到此画上了句号,小y也是第一次了解这个并查集算法,欢迎友友们多给建议
有兴趣一起学习编程的小伙伴可以私聊小y一起学习,小y在Python,c/c++和matlab语言上均有一定的基础