洛谷 P1551 亲戚【并查集】
发布日期:2021-07-01 02:47:48 浏览次数:2 分类:技术文章

本文共 1264 字,大约阅读时间需要 4 分钟。

题目背景

若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。

题目描述

规定:xy 是亲戚,yz 是亲戚,那么 xz 也是亲戚。如果 x,y 是亲戚,那么 x 的亲戚都是 y 的亲戚,y 的亲戚也都是 x 的亲戚。

输入格式

第一行:三个整数 n , m , p n,m,p n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有 n 个人,m 个亲戚关系,询问 p 对亲戚关系。
以下 m 行:每行两个数 Mi,Mj,1<=Mi,Mj<=N,表示 MiMj 具有亲戚关系。
接下来 p 行:每行两个数 Pi,Pj,询问 PiPj 是否具有亲戚关系。

输出格式

P 行,每行一个 ’Yes’或 ’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。

输入输出样例

输入 #1

6 5 31 21 53 45 21 31 42 35 6

输出 #1

YesYesNo

说明/提示:非常简单的并查集入门题哦!!!

题目:判断两个人是否是亲戚关系。

思路:套并查集的模板。很简单。代码:

#include 
using namespace std;const int maxn = 5100;int n, m, p, mi, mj, pi, pj;int father[maxn] = {
0};void Init() {
for (int i = 0; i < maxn; ++i) father[i] = -1;}int Find(int x) {
//找到集合的根 if (father[x] < 0) return x; return father[x] = Find(father[x]);}void Union(int r1, int r2) {
if (father[r1] < father[r2]) {
//按大小合并 father[r1] += father[r2]; father[r2] = r1; } else {
father[r2] += father[r1]; father[r1] = r2; }}int main() {
cin >> n >> m >> p; Init(); for (int i = 0; i < m; ++i) {
cin >> mi >> mj; int r1 = Find(mi), r2 = Find(mj); if (r1 != r2) Union(r1, r2); } for (int i = 0; i < p; ++i) {
cin >> pi >> pj; if (Find(pi) == Find(pj)) cout << "Yes\n"; else cout << "No\n"; } return 0;}

转载地址:https://memcpy0.blog.csdn.net/article/details/106655074 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:洛谷 P3958 奶酪【并查集】
下一篇:LeetCode C++ 9. Palindrome Number 简单

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年05月01日 17时40分10秒