P(洛谷)1551——亲戚(并、查)
题目:https://www.luogu.org/problem/show?pid=1551
想法:这一题属于并查集的基本应用。具体代码和步骤如下:
代码:
1 #include<stdio.h> 2 int f[20010]; //f[i]表示人i所连接的人 3 int find(int a) //查,查a连接在哪个上面 4 { 5 if(f[a]!=a)//说明还没有找到最上面的箱子 6 f[a]=find(f[a]);//查询并压缩 7 return f[a]; 8 } 9 void combine(int x,int y) //并,将连人x,y相连 10 { 11 int a,b; 12 a=find(x); 13 b=find(y); 14 if(a!=b)//两箱子连接的根源箱子不一样 15 f[a]=b;//让两者的根相连,避免有些箱子丢掉了根,去连别人了 16 else return; 17 } 18 int main() 19 { 20 int N,M,m; 21 int a,b; 22 scanf("%d %d %d",&N,&M,&m); //给每个元素建立一个集合 23 for(int i = 1 ; i <= N ; ++i) f[i] = i; //初始化,自己连在自己身上 24 //并 25 for(int i = 0 ; i < M ; ++i) 26 { 27 scanf("%d%d",&a,&b); 28 combine(a,b); 29 } 30 //查询 31 while(m--) 32 { 33 scanf("%d%d",&a,&b); 34 a = find(a); 35 b = find(b); 36 if(a == b) 37 printf("Yes\n"); 38 else printf("No\n"); 39 } 40 return 0; 41 }