并查集(基础)

并查集, 从这个名字上也可以知道是合并和查找集合的, 它也叫不相交的集的数据结构, 典型的例题有食物链, 来判断有多少个独立的树什么的, 下面一个例题,来简单的解释并查集:一个犯罪团伙一共有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

结果如下:

时间: 2024-10-13 10:49:33

并查集(基础)的相关文章

【HDU1232】畅通工程(并查集基础题)

裸敲并查集,很水一次AC 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cctype> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 #include <string> 1

【HDU1856】More is better(并查集基础题)

裸并查集,但有二坑: 1.需要路径压缩,不写的话会TLE 2.根据题目大意,如果0组男孩合作的话,应该最大的子集元素数目为1.所以res初始化为1即可. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <numeric> 7 #include <

Codeforces Round #254 (Div. 2) DZY Loves Chemistry【并查集基础】

一开始不知道题意是啥意思,迟放进去反应和后放进去反应有什么区别 对于第三组数据不是很懂,为啥312,132的组合是不行的 后来发现这是一道考察并查集的题目 QAQ 怒贴代码: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostream> 6 #include <algorithm> 7

【HDU1325】Is It A Tree?(并查集基础题)

有以下坑点: 1.结束输入不一定-1,题目中的叙述只是说所有权值都为正值. 2.是否构成一棵树不能只判断是否只有一个根节点,没有环路,而且还需要判断每个节点的入度一定是1,不然就不是一棵树. (无环路也可用树的性质:结点数 = 边树 + 1 来取代) 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cctype> 5 #include <cmath&

【HDU2120】Ice_cream&#39;s world I(并查集基础题)

查环操作,裸题.一次AC. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cctype> 5 #include <cmath> 6 #include <string> 7 #include <cstdio> 8 #include <algorithm> 9 #include <numeric>

【HDU1231】How Many Tables(并查集基础题)

什么也不用说,并查集裸题,直接盲敲即可. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cctype> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 using namespace s

并查集基础 模板题 hdu1232 畅通工程

模板题 引入并查集——一则有趣的故事 为了解释并查集的原理,我将举一个更有趣的例子.话说江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架.但大侠们有一个优点就是讲义气,绝对不打自己的朋友.而且他们信奉“朋友的朋友就是我的朋友”,只要是能通过朋友关系串联起来的,不管拐了多少个弯,都认为是自己人.这样一来,江湖上就形成了一个一个的群落,通过两两之间的朋友关系串联起来.而不在同一个群落的人,无论如何都无法通过朋友关系连起

并查集基础(入门)

最早接触并查集的时候是在做一道最小生成树问题上,当时还不会并查集,题解说用克鲁斯卡尔算法,用并查集来维护,就能够完成最小生成树. 并查集是什么呢?其实,并查集就是一个集合,它有两种操作,一个是合并(merge),一个是查找(getf). 合并就是说把具有相同祖先的集合合并成 为一个集合,查找就是说,查找某些具有相同祖先的集合.当然这个祖先只是我这样叫的(他其实并不是名义上的祖先),很多时候我们会维护很多 这样的信息,比如说,在求最小生成树的算法中,我们维护的是检查两个顶点是否属于同一个集合,也就

poj 1611~并查集基础

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 33160   Accepted: 16080 Description Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. T