若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。 | |||
输入格式 Input Format | |||
第一行:三个整数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是否具有亲戚关系。 | |||
输出格式 Output Format | |||
P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。 |
#include <cstdio>
#include <string>
long fa[10000];
long getint()
{
long rs=0;char tmp;bool sgn=1;
do tmp = getchar();
while (!isdigit(tmp)&&tmp-'-');
if (tmp == '-'){tmp=getchar();sgn=0;}
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}
long getroot(long a)
{
if (fa[a] == a)return a;
return fa[a] = getroot(fa[a]);
}
int main()
{
freopen("family.in","r",stdin);
freopen("family.out","w",stdout);
long n = getint();
long m = getint();
long p = getint();
for (long i=1;i<n+1;i++)
fa[i] = i;
for (long i=1;i<m+1;i++)
{
long a = getint();
long b = getint();
fa[getroot(a)] = getroot(b);
}
for (long i=1;i<p+1;i++)
{
long a = getint();
long b = getint();
if (getroot(a)==getroot(b))
printf("Yes\n");
else printf("No\n");
}
return 0;
}