并查集(集合合并) + 缩点

正解是dfs的一道题目被我以为成了并查集,结果坑了队友。现在分析一下自己当时为什么会想成是并查集呢。

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2588

题意:告诉一张n点m边的图,求哪些边是桥。其实就是缩点,然而却大脑短路,直接认定是并查集了,现在的我真的不能理解当时的自己。。。。

当时想的是把所有的环缩成一个点,然后剩下的边就是桥了,缩点,第一时间想的就是并查集,其实并查集的操作一般有三个:

1.初始化

把每个点所在集合初始化为其自身。

通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。

2.查找

查找元素所在的集合,即根节点。

3.合并

将两个元素所在的集合合并为一个集合。

通常来说,合并之前,应先判断两个元素是否属于同一集合,这可用上面的“查找”操作实现。

缩点:一般是Tarjan算法,dfs也可以,但是复杂度略高

目前我接触到的缩点有三种:

1、无向图缩块(缩无割点子图)-----没有割点(点被破坏后,连通性被破坏)

2、无向图缩无割边(桥)子图-----顶上的题目

3、有向图缩强连通分量------http://www.cnblogs.com/ACMERY/p/4681803.html

时间: 2024-10-29 04:54:26

并查集(集合合并) + 缩点的相关文章

CodeForces 566D 并查集集合合并

1 #include <stdio.h> 2 #include <algorithm> 3 #define MAX 100000 4 #define LL long long 5 #define unsigned U 6 //using namespace std; 7 int cas=1,T; 8 int fa[MAX*2+10],next[MAX*2+10],n,q; 9 void init(int n) 10 { 11 for(int i=1;i<=n;i++) { f

poj3667(并查集区间合并&amp;区间查询)

题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : 询问是否有长度为 x 的连号空房, 若有, 住进最左边并输出对应编号: 2 x y : 将区间 [x, x + y - 1] 的房间清空: 思路: 并查集区间合并&区间查询 下面一段题解摘自: http://www.cnblogs.com/scau20110726/archive/2013/05/0

普林斯顿公开课 算法1-9:并查集-快速合并

本节讲的是并查集的另外一种实现方法.这种方法的合并操作开销很小,但是查找操作开销很大. 数据结构 这种算法的数据结构和快速查找方法的数据结构是一样的,也是N个整数组成的数组. 数组中每个元素id[i]的含义是指i的上级是id[i]. 根节点 一个节点的根节点就是id[id[id[...id[i]....]]],一直循环直到数值不再变化为止.由于算法的特性,这种循环永远不会造成死循环. 查找操作 查找操作就是判断两个节点的根节点是否相同. 合并操作 合并节点p和节点q就是将p节点的根节点的父节点设

NYOJ合纵连横【并查集的合并和删除】

合纵连横 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法吞并那些实力弱的,让自己的领土面积不断扩大.而实力弱的诸侯王为了不让自己的领土被吞并,他会联合一些其他同样弱小的诸侯国,组成联盟(联盟不止一个),来共同抵抗那些强大的诸侯国. 强大的诸侯国为了瓦解这些联盟,派出了最优秀的间谍来离间他们,使一些诸侯国退出联盟.最开始,每个诸侯国是一个联盟. 有两种操作 1

[HDU 3712] Fiolki (带边权并查集+启发式合并)

[HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[i]克的第i种物质.吉丽需要执行一定的步骤来配置药水,第i个步骤是将第a[i]个瓶子内的所有液体倒入第b[i]个瓶子,此后第a[i]个瓶子不会再被用到.瓶子的容量可以视作是无限的. 吉丽知道某几对液体物质在一起时会发生反应产生沉淀,具体反应是1克c[i]物质和1克d[i]物质生成2克沉淀,一直进行直

【BZOJ-4668】冷战 并查集 + 启发式合并 + 乱搞

4668: 冷战 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 37  Solved: 24[Submit][Status][Discuss] Description 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争.在这段时期,虽然分歧和冲突严重,但双方都尽力避免世界范围的大规模战争(第三次世界大战)爆发

HDU-3038 How Many Answers Are Wrong(带权并查集区间合并)

http://acm.hdu.edu.cn/showproblem.php?pid=3038 大致题意: 有一个区间[0,n],然后会给出你m个区间和,每次给出a,b,v,表示区间[a,b]的区间和为v,但每次给出的区间可能与之前的有冲突,问这样起冲突的区间共有多少个 首先区间[a,b]的和可由区间[0,b]的和减去区间[0,a-1]的和得到 但是我们不太可能知道[0,b],故我们只用知道和b的合并过的区间的左端点就行 其实并查集实质就是一颗树,我们可以以树的角度去看待它,理解维护过程 不理解的

普林斯顿公开课 算法1-9:并查集-高速合并

本节讲的是并查集的第二种实现方法.这样的方法的合并操作开销非常小,可是查找操作开销非常大. 数据结构 这样的算法的数据结构和高速查找方法的数据结构是一样的,也是N个整数组成的数组. 数组中每一个元素id[i]的含义是指i的上级是id[i]. 根节点 一个节点的根节点就是id[id[id[...id[i]....]]],一直循环直到数值不再变化为止.因为算法的特性,这样的循环永远不会造成死循环. 查找操作 查找操作就是推断两个节点的根节点是否同样. 合并操作 合并节点p和节点q就是将p节点的根节点

Codeforces 455C Civilization:树的直径 + 并查集【合并树后直径最小】

题目链接:http://codeforces.com/problemset/problem/455/C 题意: 给你一个森林,n个点,m条边. 然后有t个操作.共有两种操作: (1)1 x: 输出节点x所在树的直径. (2)2 x y: 如果x,y不在同一棵树上的话,用一条边连接x,y所在的树,并且使得到的新树的直径尽可能小. 题解: 首先对于初始状态,算出每一棵树的直径d[find(i)]. 每次合并树的时候,因为要尽可能让新树直径变小,所以显然这条边要分别连接两棵树直径的“中点”. 所以新树

More is better(hdu 1856 计算并查集集合中元素个数最多的集合)

More is better Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others)Total Submission(s): 21167    Accepted Submission(s): 7720 Problem Description Mr Wang wants some boys to help him with a project. Because the project