ACM-图论-连通分量
暗金色
这个作者很懒,什么都没留下…
展开
-
强连通分量(SCC)详解
说到以Tarjan命名的算法,我们经常提到的有3个,其中就包括本文所介绍的求强连通分量的Tarjan算法。而提出此算法的普林斯顿大学的Robert E Tarjan教授也是1986年的图灵奖获得者(具体原因请看本博“历届图灵奖得主”一文)。首先明确几个概念。 强连通图。在一个强连通图中,任意两个点都通过一定路径互相连通。比如图一是一个强连通图,而图二不是。因为没有一条路使得点4到达点1、2或3。强转载 2015-09-08 16:05:40 · 3339 阅读 · 0 评论 -
HDU - 2460 Network(桥+LCA)
题目大意:给出一张图,现在要往这张图上加边,问加完边后,这张图还有多少条桥解题思路:求出连通分量,压缩成点,用桥连接,形成了棵树 每次添加边时,就找一下是否在同一个强连通分量内,如果在同一个强连通分量内,那么桥的数量不变 反之,求出两个点的LCA,并且把LCA到这两个点的桥全部去掉(因为加边后,形成了环,构成了一个新的强连通分量了)#include <cstdio>#include <cstr原创 2015-08-14 01:11:12 · 942 阅读 · 0 评论 -
双连通小结
UVA上的题目 UVA - 11324 The Largest Clique DAG+强连通分量原创 2015-09-08 21:02:45 · 912 阅读 · 0 评论 -
HDU - 3849 By Recognizing These Guys, We Find Social Networks Useful(桥)
题目大意:给你N个点,M条边,问哪几条边是桥解题思路:模版题#include <cstdio>#include <cstring>#include <map>#include <vector>#include <iostream>using namespace std;const int MAXNODE = 10010;const int MAXEDGE = 200010;struct原创 2015-09-08 23:42:21 · 413 阅读 · 0 评论 -
HDU - 4738 Caocao's Bridges(桥)
题目大意:有N座小岛,M座桥,每座桥都有相应的士兵保守。现在你有一单位的炸药可以炸掉一座桥。要炸掉一座桥的话,你派的士兵数量至少要等于该桥的士兵数量 你的任务是使这些岛屿连通。问需要破坏哪一座桥,且派的士兵最小解题思路:很简单吧,水题,找最小权值的“桥“就可以了 但是坑点多啊 如果不连通的话,就不用派士兵了 如果桥的最小权值是0的话,那么就是1了,因为至少得派一个人#include <cst原创 2015-09-08 22:17:41 · 430 阅读 · 0 评论 -
UVA - 11396 Claw Decomposition(二分图染色)
题目大意:给你一张无向图,每个点的度数都是3。你的任务是判断能否把它分解成若干个爪(每条边只能属于一个爪)解题思路:二分图染色裸题。可以得出:爪的中心点和旁边的三个点的颜色是不一样的#include <cstdio>#include <cstring>using namespace std;#define N 310#define M 2010struct Edge{ int to,原创 2015-08-08 14:44:19 · 806 阅读 · 0 评论 -
UVA - 11324 The Largest Clique (DAG + 强连通分量)
题目大意:给出一张有向图G,求一个结点数最大的结点集,使得该点集中任意两个结点u和v满足: 要么u可到达v,要么v可以到达u(u和v互相可达也可以)解题思路:u和v相互可达的时候,就是两个结点在同一个强连通分量内的时候 首先要保证集合里面的点可达:强连通分量就满足集合内的点都相互可达。所以第一件事就是找出所有的强连通分量,并统计出每个强连通分量内的结点数然后找出每个强连通分量之间的关系,也就是找原创 2015-08-07 21:18:34 · 770 阅读 · 0 评论 -
UVALive - 4287 Proving Equivalences(强连通分量 + DAG)
题目大意:给出N个命题,要求你证明这N个命题的等价性比如有4个命题a,b,c,d,我们证明a<->b, b<->c,c<->d,每次证明都是双向的,因此一共用了6次推导 如果换成证明a->b,b->c,c->d,d->a,每次证明都是单向的,而只需4次就可以证明所有命题的等价性 现在给出M个命题证明,问还需要证明几个,才可以保证N个命题等价解题思路:命题的等价,就相当于证明点到点之间是互相连通。原创 2015-08-07 21:55:38 · 857 阅读 · 0 评论 -
UVALive - 3523 Knights of the Round Table(无向图的双连通分量)
题目大意:有n个骑士经常举行圆桌会议,每次圆桌会议至少要有3个骑士参加(且每次参加的骑士数量是奇数个),且所有互相憎恨的骑士不能坐在圆桌旁的相邻位置,问有多少个骑士不可能参加任何一个会议解题思路:以骑士为点建立无向图G。如果两个骑士可以相邻(即他们并不互相憎恨),即可连一条边。 则题目就转化为求不在任何一个简单奇圈上的结点个数 首先,圈就是一个双连通的分量,所以第一件事就是将所有的双连通分量求出原创 2015-08-07 22:10:42 · 1022 阅读 · 0 评论 -
HDU - 3861 The King’s Problem(强连通分量+最小路径覆盖)
题目大意:给出一张有向图,要求你将这些点进行划分,划分依据如下 1.如果两个点互相可达,那么这两个点必须在一个集合中 2.同一个集合中任意两个点u,v要满足,要么u能到达v,要么v能到达u 3.一个点只能被划分到一个集合问最少能划分成几个点集解题思路:首先先求出所有的强连通分量,满足条件1 满足条件2,3的话,就要求出最小路径覆盖 所以可以将所有的强连通分量进行缩点,桥作为连接,然后匈牙利原创 2015-08-15 00:16:59 · 1196 阅读 · 0 评论 -
POJ - 1438 One-way Traffic(混合图改有向图)
题目大意:给出一张混合图,要求你改变尽量多的双向边,使得改变后的图还是强连通的解题思路:这题和poj-1515类似,只不过这题是混合题,大体思路还是差不多的,在dfs的时候记录一下桥和使用的是哪些边即可#include <cstdio>#include <cstring>#define min(a,b)((a) < (b) ? (a) : (b))#define N 2010#define M原创 2015-08-16 00:34:57 · 975 阅读 · 0 评论 -
LightOJ - 1210 Efficient Traffic System(强连通)
题目大意:给出一张有向图,问需要添加多少条边,才能使该有向图变成强连通图解题思路:强连通,缩点,算出每点的入度和出度,找出max(入度为0,出度为0),这个就是答案 解释一下为什么,如果要强连通的话,就得让所有点都有入度和出度,所以添加的边的数量就是max(入度为0,出度为0)#include <cstdio>#include <cstring>#include <algorithm>usin原创 2015-11-10 00:09:04 · 721 阅读 · 0 评论 -
LightOJ - 1417 Forwarding Emails(强连通+dfs)
题目大意:你有一个秘密,但你只能告诉一个。这个人如果有认识的人的话,他就会把你的秘密告诉出去,这样就一传十,十传百了。现在你想要知道,最多能有多少人知道解题思路:同一个连通分量内的人都是可知的,所以缩点,然后连边,从入度为0的点出发,dfs找出所能到的最远处,在dfs过程中统计一下有多少个人知道#include <cstdio>#include <cstring>#include <algori原创 2015-11-10 00:12:29 · 754 阅读 · 0 评论 -
LightOJ - 1034 Hit the Light Switches(强连通)
题目大意:有N盏灯,灯满足u, v要求,表示u亮了,v也就亮了 问需要开几盏灯,才能让所有的灯都亮了解题思路:强连通块内的灯能相互作用。求出强连通块,然后缩点连边,找出入度为0的点,入度为0的点,就是要按的灯的数量#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N =原创 2015-11-10 00:05:52 · 974 阅读 · 0 评论 -
LightOJ - 1063 Ant Hills(割点)
题目大意:求无向图中,有多少个割点解题思路:模版题了#include <cstdio>#include <cstring>#include <vector>#include <stack>using namespace std;#define max(a,b)((a)>(b)?(a):(b))#define min(a,b)((a)<(b)?(a):(b))const int MAXN原创 2015-11-04 22:28:07 · 464 阅读 · 0 评论 -
LightOJ - 1026 Critical Links(桥)
题目大意:给你一张无向图,问这张图中,桥的数量解题思路:模版题#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 10010;const int M = 100010;struct Edge{ int u, v, next; Edge() {}原创 2015-11-04 22:40:24 · 517 阅读 · 0 评论 -
LightOJ - 1300 Odd Personality(边双连通+奇圈判定)
题目大意:给出一张无向图,要求找出符合条件的点 条件如下:从该点出发,经过一定数量的边,又回到该点,经过的边不能重复经过,且经过的边的数量为奇数解题思路:要回到原点,且不能重复经过边,只能在边双连通分量中找了 接着要判断的是有多少个点,只要边双连通分量中有奇圈,那么这个连通分量中的所有点都是符合条件的 所以现在的问题变成了如和判断奇圈了,判断奇圈的话,用二分图染色即可#include <cst原创 2015-11-04 22:34:10 · 471 阅读 · 0 评论 -
无向图的连通分量(BCC)模版
点双连通:如果任意两点之间至少存在两条”点不重复”的路径,则说这个图是点双连通的,这个要求等价于任意两条边都在同一个简单环中,即内部无割点边双连通:如果任意两点至少存在两条“边不重复“的路径,我们说这个图是边-双连通的,这个要求低一点,只需要每条边都至少在一个简单环中,即所有的边都不是桥对于一张无向图,每条边恰好属于一个双连通分量,但不同的双连通分量之间可能会有公共点,但是不同的双连通分量之间的公共转载 2015-09-08 15:42:48 · 1736 阅读 · 0 评论 -
LightOJ - 1291 Real Life Traffic(边双连通+缩点)
题目大意:给你一张图,问将这张图变成一个边双连通块,至少要添加多少条边解题思路:先求出所有的边双连通,然后缩点,桥为连接其中的点,这样就可以形成一棵树了,而需要添加的边的数量就是(叶结点的数量 + 1 ) / 2#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 10原创 2015-11-04 22:36:57 · 666 阅读 · 0 评论 -
POJ - 3352 Road Construction(边双连通分量)
题目大意:给出一张无向图,问添加多少边才能使得这张无向图变成边双连通分量解题思路:先求出所有的边双连通分量,再将边双连通缩成一个点,通过桥连接起来,这样就形成了一棵无根树了 现在的问题是,将这颗无根树变成边双连通分量网上的解释是:统计出树中度为1的节点的个数,即为叶节点的个数,记为leaf。则至少在树上添加(leaf+1)/2条边,就能使树达到边二连通,所以至少添加的边数就是(leaf+1)/2。原创 2015-08-09 00:17:21 · 1203 阅读 · 0 评论 -
UVA - 10972 RevolC FaeLoN (边双连通分量)
题目大意:给定一个无向图,要求你把所有的无向边变成有向边,并且添加最少的有向边,使得新的有向图强连通解题思路:这题和POJ - 3352 Road Construction 类似,只不过这题给的不一定是连通图,有可能缩点后出现孤立的点,但大体的思路是一样的 前面的就不详说了,可以看戳这里里面已经写了,这里讲一下怎么处理孤立的点 如果有n个点,要求在这n个点间添加有向边,使得这n个点变成强连通,原创 2015-08-09 08:54:16 · 753 阅读 · 1 评论 -
HDU - 1269 迷宫城堡(强连通分量)
中文题解题思路:强连通分量模版,裸题#include <cstdio>#include <cstring>#include <vector>using namespace std;#define N 10010#define M 100010struct Edge{ int to, next;}E[M];int head[N], sccno[N], pre[N], lowlink原创 2015-08-12 00:28:19 · 830 阅读 · 0 评论 -
POJ - 1904 King's Quest(强连通分量+二分图匹配)
题目大意:有N个帅哥和N个美女,现在给出每个帅哥所喜欢的美女的编号,和一个帅哥和美女的完美匹配 问每个帅哥可以娶多少个美女,且当他娶完这个美女后,剩下的人还可以完美匹配解题思路:神题啊,给一个大神的详细解答 具体是这样的,首先先建边,把帅哥和能娶到的美女连边,再把完美匹配的美女和帅哥连边,这样就形成了一张有向图了 接着,找出这张有向图的所有强连通分量,在强连通分量里面的帅哥都可以娶到自己喜欢的原创 2015-08-16 00:19:46 · 892 阅读 · 0 评论 -
POJ - 3177 Redundant Paths(强连通分量)
题目大意:给出一张无向图,如果要让每两点之间都有两条不同的路径可以相互到达,问至少还要添加几条边解题思路:添加的边的数量就是(入度为1的点 + 1) /2,也就是所有连通分量缩图后,形成的树的(叶子结点+1) / 2 这题和前面做过的类似,这里只是搬运了一下别人的另一种写法 如果属于同一个连通分量的话,那么他们的lowlink是一样的,所以可以用来直接判断,而不需要再dfs的时候再把每个点归属到原创 2015-08-16 00:27:17 · 791 阅读 · 0 评论 -
POJ - 1523 SPF(割点)
题目大意:给出一张图,问去割点后,连通分量的个数有多少解题思路:割点的水题,套模版就可以 不得不吐槽一下输入。。#include <cstdio>#include <cstring>#define min(a,b) ((a)<(b)?(a):(b))#define N 1010#define M 2000010struct Edge{ int to, next;}E[M];int原创 2015-08-16 00:37:33 · 730 阅读 · 0 评论 -
HDU - 4005 The war(dfs+边双连通)
题目大意:给出N个发射站,M条电线,你的敌人想多添加一条电线。但你并不知道敌人新添加的电线是哪一条。 现在你的任务是炸掉一条电线,使得其不连通,且花费的代价最小解题思路:炸掉的电线肯定是桥了 所以先求出所有的边连通分量,然后再进行缩点,形成一棵树 再找出这棵树上边权最小的一条边的两个点。 贪心的话,要炸掉的边肯定是最小边了,但是敌人有可能通过连线把最小边弄到一个边双连通内 所以分别从最小边原创 2015-09-09 15:10:46 · 564 阅读 · 0 评论 -
POJ - 1515 Street Directions(无向图变有向图)
题目大意:给出一张无向图,任意两点可相互到达,现在要求你将这张无向图变成有向图,且改变之后任意两点还是可相互到达的解题思路:桥的话肯定是要保留双向的,所以可以在dfs的时候把桥标记出来,顺便在dfs的时候标记一下使用的是哪条边即可#include <cstdio>#include <cstring>#define N 1010#define M 1000010#define min(a,b)原创 2015-08-16 00:31:34 · 1147 阅读 · 0 评论 -
UVALive - 5135 Mining Your Own Business(双连通分量)
题目大意:有N个矿井 ,由一些隧道连接起来,现在要修建尽量少的安全通道,使得无论哪里发生事故,所有人均能逃出,求建的最少的安全通道数量和方案数解题思路:建安全通道的话,肯定不能建在割顶,因为割顶如果崩塌了,割顶所连接的双连通分量内的点就跑不掉了,还得在双连通分量里面再建点(上述为双连通分量内部只有一个割顶的情况),这样不划算,还不如直接在里面建点 如果一个双连通分量的内部割顶有多个的话,那么在这个原创 2015-08-07 23:11:13 · 1201 阅读 · 1 评论 -
UVA - 10765 Doves and bombs(双连通分量)
题目大意:给定一个n个点的连通的无向图,一个点的“鸽子值“定义为将它从图中删去后连通块的个数,求每个点的“鸽子值“解题思路:双连通分量的裸题。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 10010#define M 100010struct Edge{ in原创 2015-08-08 15:26:25 · 819 阅读 · 0 评论 -
HDU - 2242 考研路茫茫――空调教室(树形DP+强连通分量)
题目大意:众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们。Lele也是其中一个。而某教室旁边又摆着两个未装上的空调,更是引起人们无限YY。 一个炎热的下午,Lele照例在教室睡觉的时候,竟然做起了空调教室的美梦。 Lele梦到学校某天终于大发慈悲给某个教室安上了一个空调。而且建造了了M条通气管道,让整个教学楼的全部教室都直接或间接和空调教室连通上,构成了教室群,于是,全部原创 2015-08-12 00:55:10 · 1247 阅读 · 0 评论 -
FZU - 1719 Spy Network(强连通分量)
题目大意:给出一个张有向图,和N个点的价值(买了这个点后,以这个点出发的所能遍及的点都会被染色)问至少要花费多少钱去买点,才能使得这张图的所有点都被染色 如果不能所有的点都染色,输出不能染色点的最小值解题思路:先求出所有的强连通分量,接着求出每个强连通分量内所有点的最少价值,因为同一个强连通分量内的点只需要购买一个就可以全部染色了 接着缩点,用桥连接起来,形成一张新的图(以下所说的点都是强连通分原创 2015-08-15 00:43:15 · 1009 阅读 · 0 评论 -
POJ - 2762 Going from u to v or from v to u?(拓扑排序+强连通分量)
题目大意:给出N个点,M条有向边,问是否任意两点u,v都满足u能到达v或者v能到达u解题思路:强连通分量内的所有的点都满足,接着要判断一下其他的点能否满足了 求出所有的强连通分量,接着缩点,用桥连接,形成新的图(以下所说的点都是指新的图的点) 如果一个点同时指向另外两个不同的点,那么这两个点之间肯定是不能相互到达的,所以拓扑排序一下,就可以知道是否符合了#include <cstdio>#in原创 2015-08-15 00:49:00 · 1875 阅读 · 0 评论 -
HDU - 3836 Equivalent Sets (强连通分量+DAG)
题目大意:给出N个点,M条边,要求你添加最少的边,使得这个图变成强连通分量解题思路:先找出所有的强连通分量和桥,将强连通分量缩点,桥作为连线,就形成了DAG了这题被坑了。用了G++交的,结果一直RE,用C++一发就过了。。。#include <cstdio>#include <cstring>#define N 20010#define M 100010#define min(a,b) ((a原创 2015-08-12 00:37:11 · 948 阅读 · 0 评论 -
HDU - 1827 Summer Holiday(强连通分量+贪心)
题目大意:To see a World in a Grain of Sand And a Heaven in a Wild Flower, Hold Infinity in the palm of your hand And Eternity in an hour. ―― William Blake 听说lcy帮大家预定了新马泰7日游,Wiskey原创 2015-08-12 00:43:10 · 2044 阅读 · 0 评论 -
HDU - 3594 Cactus(仙人掌图)
题目大意:给出仙人掌图的定义: 1.必须是强连通 2.每条边只能属于一个环解题思路:在tarjan算法中加入点东西就可以判断了 只要该点能连到之前的点,那么形成环了,找到这个环的所有的边,并标记 如果有一条边被标记了两次了,那图就不是仙人掌图了关键是怎么找到这个环的所有边,我们可以引入另一个栈,这个栈存放的是边的序号 假设当前点为u,u点连回之前的点是v,那么就从栈里面找边,找到出发点为v原创 2015-08-12 00:50:25 · 1487 阅读 · 0 评论 -
HDU - 3072 Intelligence System(强连通分量+类最小生成树)
题目大意:有一个人想要将消息告诉给所有人(在同一个强连通分量里面的人可以相互转告,费用为0),问所有人都知道消息的最小花费是多少解题思路:求出所有的强连通分量,然后将其缩点,桥就是连接其中的边 因为是张连通图,所以只要求出每个强连通分量被通知的最小价值,然后累加即可 刚开始以为可以用最小生成树,但发现错了,假设求出了三个强连通分量了,分别标号为1,2,3 再给出桥 1-2,权值1,1-3权值5原创 2015-08-14 01:01:28 · 944 阅读 · 0 评论 -
HDU - 5215 Cycle(奇圈和偶圈)
题目大意:给你一张有向图,问是否存在奇圈和偶圈解题思路:二分图染色,如果染色成功,证明没有奇圈 给出大神的传送门染色的时候,如果下一个点已经被染了,说明已经形成了一个圈了,那怎么判断是奇圈还是偶圈首先,该点如果和下一个点的颜色不同,那么该圈就是偶圈了,反之,如果该点与下一点的颜色相同,该圈就是奇圈了但是存在一种情况,两个奇圈合成了一个偶圈的,比如平行四边形加上一条对角线,这张图就是奇圈和偶圈的结合原创 2015-08-16 00:49:45 · 4476 阅读 · 0 评论 -
POJ - 1236 Network of Schools(强连通分量)
题目大意:有N个点,接着给出N个点所能连接的点。 问题1:如果要将一个信息传递给这N个点,至少需要传递给多少个点,然后让这些点进行传播,使N个点都得到信息 问题2:需要添加多少条边才能使这N个点能两两连通解题思路:求出所有的强连通分量,接着缩点,再以桥为路径,建图 找出这张图中入度为0的,因为只有入度为0的才需要进行通知,其他的点可以通过其他边进行传达需要添加多少个点,观察这张图,求出每个点的原创 2015-08-15 00:28:15 · 898 阅读 · 0 评论 -
HDU - 3394 Railway(连通分量+环)
题目大意:有一个人奇怪的人想要铺路,这个人想把每个环都铺上石头,但是铺石头时不能重复铺,如果重复铺的话,这条边就算损坏 问这个人要损坏多少条边,有多少条边可以不用铺石头解题思路:不用铺石头的边肯定是桥,因为桥不属于任意一个环 接着判断一下有多少条边会冲突,首先,一个环的话肯定是点-双连通,但点-双连通不一定是个环,所以这个要判断一下。 一个正常的环是要满足 边数=点数 的,如果边数比点数多了,原创 2015-08-14 01:19:40 · 917 阅读 · 0 评论 -
HDU - 3639 Hawk-and-Chicken(dfs+强连通分量)
题目大意:有N个人进行投票,想要选择出最受欢迎的人,投票的规则如下 1.不能投给自己 2.投票可以传递,比如A投给B一票,B投给C一票,那么C就得到了A的一票和B的一票问票数最多能得多少,得到最高票的有哪些人解题思路:求出所有的强连通分量,这些强连通分量里面的人得到的票数都是一样的,为强连通分量内的点数-1接着将强连通分量进行缩点,用桥连接起来,反向建边 接着以所有出度为0的点进行dfs,得出原创 2015-08-15 00:35:29 · 1257 阅读 · 0 评论