亲戚
题目描述
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 规定: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,表示Ai和Bi具有亲戚关系。 接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。
输出格式
P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。
input
6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6
output
Yes
Yes
No
样例太水难不想解释。。。
这题主要就是先把父亲结点合集并在一起,最后查找两个结点的跟结点是否相同就行 了。
代码与思路如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,p,f[5010],x,y,t;
cin>>n>>m>>p;
for (int i=1;i<=n;i++)
f[i]=i;//这里请注意,一开始一定要先把每个点的父亲结点设为自己,不然什么都不会发生。。。
for (int i=1;i<=m;i++)
{
cin>>x>>y;
if (f[x]!=f[y])//如果两个亲戚的父亲结点不同
t=f[x];//那么用t先暂且储存一下f[x]的父亲节点,避免变化
for (int j=1;j<=n;j++)
if (t==f[j])//如果t和f[j]相等
f[j]=f[y];//就把父亲结点统一
}
for (int i=1;i<=p;i++)
{
cin>>x>>y;//不要问我为什么我一直用x和y。。。
if (f[x]==f[y])//判断两个结点的元是否相同
cout<<"Yes"<<endl;//相同代表他们是亲戚
else cout<<"No"<<endl;//不相同则不是
}
return 0;
}