n 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 n 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。 n 数据输入: n 第一行:三个整数n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。 n 以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Ai和Bi具有亲戚关系。 n 接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。 n 数据输出: n P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。 n 样例: n input.txt n 6 5 3 n 1 2 n 1 5 n 3 4 n 5 2 n 1 3 n 1 4 n 2 3 n 5 6 n output.txt n Yes n Yes n No 这是学习资料上的一题,拿来练手,并查集基础 #include<stdio.h> int parent[5005]; int rank[5005]; void Create(int i) { parent[i]=i; rank[i]=0; } int Find(int x) { if(parent[x]==x) { return x; } else parent[x]=Find(parent[x]); } void Union(int a,int b) { int l1=Find(a); int l2=Find(b); if(rank[l1]>rank[l2]) parent[l2]=l1; else parent[l1]=l2; if(rank[l1]==rank[l2]) rank[l2]++; } int main() { int n,m,p; while(scanf("%d%d%d",&n,&m,&p)!=EOF) { for(int i=1;i<=n;i++) Create(i); int a,b; for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); Union(a,b); } for(int i=1;i<=p;i++) { scanf("%d%d",&a,&b); int l1=Find(a); int l2=Find(b); if(l1==l2) printf("Yes/n"); else printf("No/n"); } } return 0; }