华师一附中OI组
标题:
P1551 亲戚
[打印本页]
作者:
admin
时间:
2018-5-21 22:33
标题:
P1551 亲戚
https://www.luogu.org/problemnew/show/P1551
题目背景
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
题目描述
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。
输入输出格式
输入格式:
第一行:三个整数n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。
以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Mi和Mj具有亲戚关系。
接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。
输出格式:
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
说明
非常简单的并查集入门题哦!!!
作者:
zhwang
时间:
2018-7-27 23:19
#include<stdio.h>
int f[10001],n,m,p;
int a[5001];
int b[5001];
int getf(int num)
{
if(f[num]==num)
{
return num;
}
else
{
f[num]=getf(f[num]);
return f[num];
}
}
void bing(int father,int son)
{
int t1=getf(father);
int t2=getf(son);
if(t1!=t2)
{
f[t2]=t1;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
{
f[i]=i;
}
int x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
bing(x,y);
}
for(int i=1;i<=p;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
for(int i=1;i<=p;i++)
{
if(getf(f[a[i]])==getf(f[b[i]]))
{
printf("Yes\n");
}
else
{
if(getf(f[a[i]])!=getf(f[b[i]]))
{
printf("No\n");
}
}
}
return 0;
}
复制代码
作者:
吴语林
时间:
2018-7-28 07:45
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
int x,y,n,m,t,fa[6000];
int getf(int u)
{
if(u==fa[u])
return u;
int f=getf(fa[u]);
fa[u]=f;
return f;
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
fa[i]=i;
while(m--)
{
scanf("%d%d",&x,&y);
int t1=getf(x),t2=getf(y);
if(t1!=t2)
fa[t1]=t2;
}
while(t--)
{
scanf("%d%d",&x,&y);
if(getf(x)==getf(y))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-7-28 08:28
本帖最后由 黄煦喆 于 2018-7-28 09:10 编辑
#include<iostream>
using namespace std;
int n,m,p;
int a,b;
int father[5001];
int f(int x)
{
while(father[x]!=father[father[x]])father[x]=father[father[x]];
return father[x];
}
void merge(int x,int y)
{
x=f(x);
y=f(y);
if(x==y)return;
else father[y]=x;
}
void query(int x,int y)
{
if(f(a)==f(b))cout<<"Yes";
else cout<<"No";
cout<<endl;
}
int main()
{
cin>>n>>m>>p;
for(int i=1; i<=n; i++)father[i]=i;
for(int i=1; i<=m; i++)
{
cin>>a>>b;
merge(a,b);
}
for(int i=1; i<=p; i++)
{
cin>>a>>b;
query(a,b);
}
return 0;
}
复制代码
作者:
walk_alone
时间:
2018-7-29 19:06
#include <cstdio>
int father[5001];
int getfather(int x)
{
if(x!=father[x])
father[x]=getfather(father[x]);
return father[x];
}
int main()
{
int n,m,p,a,b;
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
father[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
father[getfather(a)]=getfather(b);
}
for(int i=1;i<=p;i++)
{
scanf("%d%d",&a,&b);
if(getfather(a)!=getfather(b))
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
复制代码
作者:
liubo
时间:
2018-7-29 22:26
#include<iostream>
using namespace std;
int p[5005];
int n,m,q;
int f(int i){
return p[i] == i ? i : p[i] = f(p[i]);
}
void mer(int i,int j){
int fi = f(i),fj = f(j);
if(fi != fj)
p[fi] = fj;
return;
}
void ask(int i,int j){
int fi = f(i),fj = f(j);
if(fi == fj)
cout << "Yes" << endl;
else cout << "No" << endl;
return;
}
int main(){
cin >> n >> m >> q;
for(int i = 1;i <= n;i++)
p[i] = i;
for(int i = 1;i <= m;i++){
int x,y;
cin >> x >> y;
mer(x,y);
}
for(int i = 1;i <= q;i++){
int x,y;
cin >> x >> y;
ask(x,y);
}
return 0;
}
复制代码
作者:
张笑宇
时间:
2018-7-30 09:45
#include<iostream>
using namespace std;
int n,m,p;
const int mx=5010;
int par[mx],i;
int getpar(int a)
{///找根节点
if (par[a]!=a)
par[a]=getpar(par[a]);
return par[a];
}
int query(int a,int b)
{///查询a,b是否在同一个集合
return getpar(a)==getpar(b);
}
void merge_(int a,int b)
{///合并a,b所在集合
par[getpar(a)]=getpar(b);
return;
}
int main()
{
cin>>n>>m>>p;
for (i=1;i<=n;i++) par[i]=i;
for (i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
merge_(a,b);
}
for (i=1;i<=p;i++)
{
int a,b;
cin>>a>>b;
bool bb=query(a,b);
if (bb==1) cout<<"Yes"<<endl;
if (bb==0) cout<<"No"<<endl;
}
return 0;
}
复制代码
作者:
ZMQ
时间:
2018-8-6 21:58
提示:
作者被禁止或删除 内容自动屏蔽
作者:
秀木于林
时间:
2019-10-31 13:38
int getfather(int x)
{
if(x!=father[x])
father[x]=getfather(father[x]);
return father[x];
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2