大家好,我是泡泡,给大家带来每日一题的目的是为了更好的练习算法,我们的每日一题这个月进度是数据结构,让大家练到各种各样的数据结构题目,熟悉数据结构的增删改查,一年以后,蜕变成为一个不一样的自己!
📒博客首页:泡泡的首页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
❤️ :热爱C/C++与算法学习,云计算等,期待一起交流!
🙏作者水平有限,如果发现错误,求告知,多谢!
👻高校算法学习社区:https://bbs.csdn.net/forums/Suanfa
一起加入刷题内卷大军,还可以加入专属内卷群,里面福利多多大佬多多!
目录
今日题目:亲戚
1.题目要求
规定:xx 和 yy 是亲戚,yy 和 zz 是亲戚,那么 xx 和 zz 也是亲戚。如果 xx,yy 是亲戚,那么 xx 的亲戚都是 yy 的亲戚,yy 的亲戚也都是 xx 的亲戚。
输入格式
第一行:三个整数 n,m,p(n,m,p≤5000),分别表示有 n 个人,m 个亲戚关系,询问 p 对亲戚关系。
以下 m 行:每行两个数 Mi,Mj,N1≤Mi, Mj≤N,表示Mi 和 Mj 具有亲戚关系。
接下来 p 行:每行两个数 Pi,Pj,询问 Pi 和 Pj 是否具有亲戚关系。
输出格式
p 行,每行一个
Yes
或No
。表示第 i 个询问的答案为“具有”或“不具有”亲戚关系。
2.题目分析
题目难度:⭐️
题目涉及算法:并查集。
ps:有能力的小伙伴可以尝试优化自己的代码或者一题多解,这样能综合提升自己的算法能力
题解报告:
1.思路
这道题基本就是并查集模板了,初始化完成之后把亲戚合并,之后循环p次寻找关系。
2.代码
#include<bits/stdc++.h>
using namespace std;
const int N = 10001;
int pre[N];
bool vis[N];
int find(int x)
{
if(x!=pre[x])
{
return pre[x] = find(pre[x]);
}
return x;
}
void join(int x,int y)
{
int xx = find(x);
int yy = find(y);
if(xx!=yy)
{
pre[yy] = xx;
}
}
int main()
{
int n,m,p,x,y;
cin>>n>>m>>p;
int z,j;
for(int i=1;i<=n;i++)
{
pre[i] = i;
}
for(int i=1;i<=m;i++)
{
cin>>x>>y;
join(x,y);
}
for(int i=1;i<=p;i++)
{
cin>>z>>j;
if(find(z)==find(j))
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}