- 数据输入:
- 第一行:三个整数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.txt6 5 31 21 53 45 21 31 42 35 6output.txtYesYesNo
-
这个题目是最基础的并查集问题运用基本的并查集工具就可以解决了
-
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 const int N=5100; 5 int ai,aj,pi,pj; 6 int m,n,p; 7 int pa[N]; 8 int cha(int k) 9 { 10 if(pa[k]!=k) 11 { 12 pa[k]=cha(pa[k]); 13 } 14 return pa[k]; 15 } 16 bool bing(int x,int y) 17 { 18 int x2=cha(x); 19 int y2=cha(y); 20 if(x2==y2) 21 return false; 22 pa[y2]=x2; 23 return true; 24 } 25 int main() 26 { 27 while(scanf("%d%d%d",&n,&m,&p)!=EOF) 28 { 29 for(int i=0;i<=n;i++) 30 { 31 pa[i]=i; 32 } 33 for(int i=1;i<=m;i++) 34 { 35 scanf("%d%d",&ai,&aj); 36 bing(ai,aj); 37 } 38 for(int i=1;i<=p;i++) 39 { 40 scanf("%d%d",&pi,&pj); 41 if(cha(pi)==cha(pj)) 42 printf("Yes\n"); 43 else 44 printf("No\n"); 45 } 46 } 47 return 0; 48 }
转载于:https://www.cnblogs.com/tianmin123/p/4617773.html