每日一练-亲戚关系

亲戚关系

        • 题目描述
        • 解题思路
        • Python源码
        • Summary


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,p5000),分别表示又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 1Mi,MjN ,表示 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行,每行一个YesNo 。表示第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次询问。

  • 核心处理
      主要是使用并查集的模板来进行解题:先使用列表推导式初始化,然后使用合并模板将亲戚关系进行处理,最后使用路径压缩的查询模板查找询问的两个父节点,一致则说明他们具有亲戚关系。


Python源码
# _*_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')

Summary

  小y的今日一练到此画上了句号,小y也是第一次了解这个并查集算法,欢迎友友们多给建议
  有兴趣一起学习编程的小伙伴可以私聊小y一起学习,小y在Python,c/c++和matlab语言上均有一定的基础


欢迎您的点赞+收藏+关注❤

你可能感兴趣的:(种菜籽得木瓜,蓝桥杯,职场和发展,算法,python,学习)