首页 > 其他 > 详细

并查集

时间:2020-04-20 19:11:38      阅读:63      评论:0      收藏:0      [点我收藏+]
 1 #include <stdio.h>
 2 int f[1000] = {0},n,m,k,sum = 0;
 3 
 4 void init()//初始化 
 5 {
 6     int i;
 7     for(i = 1;i <= n;i++)
 8         f[i] = i;
 9 }
10 //找爹的递归函数,就是找犯罪集团的最高领导人 
11 int getf(int v)
12 {
13     if(f[v] == v)
14         return v;
15     else
16     {
17         f[v] = getf(f[v]);
18         return f[v];
19     }
20 }
21 void merge(int v,int u)
22 {
23     int t1,t2;
24     t1 = getf(v);
25     t2 = getf(u);
26     if(t1 != t2);//判断两个节点是否在同一个集合中 ,即是否为同一个祖先 
27     {
28         f[t2] = t1;
29         //靠左原则,左边的变成右边的boss 
30     }
31 }
32 
33 int main (void)
34 {
35     int i,x,y;
36     scanf("%d %d",&n,&m);
37     init();
38     for(i = 1;i<=m;i++)
39     {
40         //合并犯罪团伙 
41         scanf("%d %d",&x,&y);
42         merge(x,y);
43     }
44     for(i = 1;i <= n;i++)
45     {
46         if(f[i]==i)
47             sum++;
48     }printf("%d",sum);
49     return 0;
50  } 
测试数据:
10 9
1 2
3 4
5 2
4 6
2 6
8 7
9 7
1 6
2 4
结果:3
并查集也称不想交集数据结构
核心,擒贼先擒王,最终只有如f【i】 = i的,那么i就是犯罪团伙首领

 

并查集

原文:https://www.cnblogs.com/FutureSience/p/12739585.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!