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 }

 

posted on 2018-08-23 17:07  李瑶瑶lyy  阅读(190)  评论(0编辑  收藏  举报

导航