码迷,mamicode.com
首页 > 其他好文 > 详细

并查集(基础)

时间:2014-10-20 21:07:44      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   for   sp   数据   div   

并查集, 从这个名字上也可以知道是合并和查找集合的, 它也叫不相交的集的数据结构, 典型的例题有食物链, 来判断有多少个独立的树什么的, 下面一个例题,来简单的解释并查集:一个犯罪团伙一共有n个人, 现在只知道谁跟谁一伙, 来求出一共有多少个团伙, 代码如下:

 1 #include <stdio.h>
 2 //并查集
 3 /*此案例是给定总个数, 从1到n, 然后给定谁和谁是一伙的,
 4 输入一个m来确定一个有多少个一伙的, 求出最后一个有几伙*/
 5 int f[1000], n, m, k, sum = 0;
 6 //初始化
 7 void init()
 8 {
 9     for(int i = 1; i <= n; i++)
10         f[i] = i;
11 }
12 //找到它的父亲
13 int getf(int i)
14 {
15     if(i != f[i])
16     {
17         f[i] = getf(f[i]);//路径压缩
18     }
19     return f[i];
20 }
21 //合并函数,
22 void merge(int i, int j)
23 {
24     int t1 = getf(i);
25     int t2 = getf(j);
26     if(t1 != t2)
27     {
28         f[t2] = t1;
29     }
30 }
31 
32 int main()
33 {
34 //    freopen("1.in", "r", stdin);
35     scanf("%d ", &n);
36     init();
37     int m;
38     scanf("%d ", &m);
39     int x, y;
40     for(int i = 1; i <= m; i++)
41     {
42         scanf("%d %d", &x, &y);
43         merge(x, y);
44     }
45     for(int i = 1; i <= n; i++)
46     {
47         if(f[i] == i)
48             sum++;
49     }
50     printf("%d\n", sum);
51     return 0;
52 }

测试数据:

10 9
1 2
3 4
5 2
4 6
2 6
8 7
9 7
1 6
2 4

结果如下:

 

bubuko.com,布布扣

并查集(基础)

标签:style   blog   http   color   io   for   sp   数据   div   

原文地址:http://www.cnblogs.com/Howe-Young/p/4038546.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!