强连通分支、桥和割点

合集下载

连通图的割点、割边(桥)、块、缩点,有向图的强连通分量

连通图的割点、割边(桥)、块、缩点,有向图的强连通分量

连通图的割点、割边(桥)、块、缩点,有向图的强连通分量一、基本概念无向图割点:删掉它之后(删掉所有跟它相连的边),图必然会分裂成两个或两个以上的子图。

块:没有割点的连通子图割边:删掉一条边后,图必然会分裂成两个或两个以上的子图,又称桥。

缩点:把没有割边的连通子图缩为一个点,此时满足任意两点间都有两条路径相互可达。

求块跟求缩点非常相似,很容易搞混,但本质上完全不同。

割点可以存在多个块中(假如存在k个块中),最终该点与其他点形成k个块,对无割边的连通子图进行缩点后(假设为k个),新图便变为一棵k个点由k-1条割边连接成的树,倘若其中有一条边不是割边,则它必可与其他割边形成一个环,而能继续进行缩点。

有割点的图不一定有割边,如:3是割点,分别与(1,2)和(4,5)形成两个无割点的块有割边的图也不定有割点,如:w(1,2)为割边,有向图强连通分量:有向图中任意两点相互可达的连通子图,其实也相当于无向图中的缩点二、算法无向图借助两个辅助数组dfn[],low[]进行DFS便可找到无向图的割点和割边,用一个栈st[]维护记录块和“缩点”后连通子图中所有的点。

dfn[i]表示DFS过程中到达点i的时间,low[i]表示能通过其他边回到其祖先的最早时间。

low[i]=min(low[i],dfn[son[i]])设 v,u之间有边w(v,u),从v->u:如果low[u]>=dfn[v],说明v的儿子u不能通过其他边到达v的祖先,此时如果拿掉v,则必定把v的祖先和v的儿子u,及它的子孙分开,于是v便是一个割点,v和它的子孙形成一个块。

如果low[u]>dfn[v]时,则说明u不仅不能到达v的祖先,连v也不能通过另外一条边直接到达,从而它们之间的边w(v,u)便是割边,求割边的时候有一个重边的问题要视情况处理,如果v,u之间有两条无向边,需要仍视为割边的话,则在DFS的时候加一个变量记录它的父亲,下一步遇到父结点时不扩展回去,从而第二条无向重边不会被遍历而导致low[u]==dfn[v] ,而在另外一些问题中,比如电线连接两台设备A,B 如果它们之间有两根电线,则应该视为是双连通的,因为任何一条电线出问题都不会破坏A和B之间的连通性,这个时候,我们可以用一个used[]数组标记边的id,DFS时会把一条无向边拆成两条有向边进行遍历,但我们给它们俩同一个id号,在开始遍历v->u前检查它的id是否在上一次u->v 时被标记,这样如果两点之间有多条边时,每次遍历都只标记其中一条,还可以通过其他边回去,形成第二条新的路求割点的时候,维护一个栈st 每遍历到一个顶点v则把它放进去,对它的子孙u如果dfn[u]为0,则表示还没有遍历到则先DFS(u),之后再判断low[u]和dfn[v],如果low[u]>=dfn[v],则把栈中从栈顶到v这一系列元素弹出,这些点与v 形成一个块,如果u的子孙x也是一个割点,这样做会不会错把它们和v,u放在一起形成一个块呢,这种情况是不会发生的,如果发现x是一个割点,则DFS 到x那一步后栈早就把属于x的子孙弹出来了,而只剩下v,u的子孙,它们之间不存在割点,否则在回溯到v之前也早就提前出栈了!画一个图照着代码模拟一下可以方便理解。

《离散数学》图的基本概念-2

《离散数学》图的基本概念-2
记 Gv: 从G中删除v及关联的边 GV: 从G中删除V中所有的顶点及关联的边 Ge : 从G中删除e GE: 从G中删除E中所有边
定义 设 无 向 图 G=<V,E>, 如 果 存 在 顶 点 子 集 VV, 使 p(GV)>p(G),而且删除V的任何真子集V后( VV), p(GV)=p(G), 则称V为G的点割集. 若{v}为点割集, 则称v 为割点. 理解:删除点后连通分支数可能增加,会减少吗?
14
7.3 图的矩阵表示
无向图的关联矩阵 有向图的关联矩阵 有向图的邻接矩阵 有向图的可达矩阵
15
无向图的关联矩阵
定义 设无向图G=<V,E>, V={v1, v2, …, vn}, E={e1, e2, …, em}, 令mij为vi与ej的关联次数,称(mij)nm为G 的关联矩阵,记为M(G).
7.2 通路、回路与图的连通性
简单通(回)路, 初级通(回)路, 复杂通(回)路 无向连通图, 连通分支 弱连通图, 单向连通图, 强连通图 点割集与割点 边割集与割边(桥)
1
通路与回路
定义 给定图G=<V,E>(无向或有向的),设G中顶点与边的交
替序列=v0e1v1e2…elvl:
1 0 0 1 2 0 0 0 0 0
17
无向图的相邻矩阵
v1 e1
e2
e3
e4 v2
i j
aij +2
n i 1
v3 v4
0 1 1 0
A(G) 1 0 1 0 1 1 1 1 0 0 0 0
e5
(1)相邻矩阵是对称矩阵。 (2)对角元素aii≠0,表示结点vi处有环。 (3)如aij >1,表示vi与vj间有平行边。

连通分支的定义

连通分支的定义

连通分支的定义一、引言连通分支是图论中的一个重要概念,用于描述图中的连通性。

在图中连接在一起的节点构成一个连通分支。

在本文中,我们将详细讨论连通分支的定义、性质以及如何在图中找到连通分支,旨在帮助读者更深入地了解和理解这一概念。

二、定义连通分支是指图中的节点集合,其中的任意两个节点之间都存在一条路径。

换句话说,对于连通分支中的任意两个节点,我们可以通过边来沿路径相互到达。

连通分支是图中的一个最大连通子图,因为它包含了图中所有可以通过路径相互到达的节点。

三、性质连通分支具有以下性质:1. 最大性质连通分支是一个最大连通子图,即它不包含在其他的连通分支中。

换句话说,如果我们将连通分支中的任意一个节点添加到该分支外的节点中,将会破坏连通性。

2. 无向图中的连通分支对于无向图而言,连通分支是无向图中的极大连通子图。

一个无向图可以包含多个连通分支,每个连通分支都是一个独立的连通子图。

3. 有向图中的连通分支对于有向图而言,连通分支是有向图中的极大强连通子图。

强连通子图是指其中的所有节点之间互相可达,即对于连通分支中的任意两个节点,存在一条有向路径可以从一个节点到达另一个节点。

四、寻找连通分支的算法在图中寻找连通分支的算法是一项基本的图算法,下面介绍两种常见的算法:广度优先搜索(BFS)和深度优先搜索(DFS)。

1. 广度优先搜索(BFS)广度优先搜索是一种用于遍历或搜索图中节点的算法。

它从一个起始节点开始,逐层地遍历其邻接节点,直到遍历完所有连通的节点。

在遍历过程中,我们可以记录下每个连通分支的节点。

以下是广度优先搜索的基本步骤: 1. 创建一个队列,并将起始节点放入队列中。

2. 从队列中取出一个节点,并标记为已访问。

3. 遍历该节点的所有邻接节点,并将未访问的邻接节点放入队列中。

4. 重复步骤2和步骤3,直到队列为空。

5. 如果还存在未访问的节点,重复步骤2到步骤4。

2. 深度优先搜索(DFS)深度优先搜索也是一种用于遍历或搜索图中节点的算法。

连通分支等概念深刻理解无向图的点割集和边割集

连通分支等概念深刻理解无向图的点割集和边割集
2
证:(反证法)设结论不成立,即存在
v V , (G-v) 1 d(v)
2
因为G是连通的,所以G-v的每个分支都至少有
一个点与v相邻接,而且存在一个分支,其与v相邻接
的点w只有一条边与v相连(因为如每个分支中有二个
以上的点与v相连,则 d(v) 2(G-v) d(v) ,出现矛
2019/12/23
计算机学院
2
5. 深刻理解无向图的连通性,连通分支等概念 6. 深刻理解无向图的点割集和边割集、点连通
度、边连通度等概念及其之间的关系,并能 熟练地求出给定的较为简单的图的点割集和 边割集、点连通度与边连通度 7. 深刻理解有向图连通性的概念及其分类,掌 握判断有向连通图类型的方法 8. 深刻理解有向图的邻接矩阵、可达矩阵的基 本概念
25
………
w
………
v
2019/12/23
计算机学院
26
30、解:
v1 e1 v2
e2
v3
e7
e3 e5
e6 v5
e4
v4
e8
v6
e9
e11
e12
e10
v7
v1 v2 v3 v4 v5 v6 v7
0 1 1 0 0
0
0

0 0 0 1 0 0 0

A

0 1

0 011 0101

m

n(n 1 ) 2

C
2 n
2019/12/23
计算机学院
16
4、证:
由欧拉定理,2m d(v)
vG
d(v)
vG vG

考研数学知识点总结

考研数学知识点总结

考研数学知识点总结一、高等数学1. 极限与连续极限:数列极限、函数极限、无穷极限、极限的性质和运算法则连续:函数连续性、连续函数的性质、间断点、闭区间连续性定理2. 导数与微分导数的概念:函数的导数、导数的性质微分:函数的微分、微分的性质、高阶微分3. 微分方程微分方程的解法:可分离变量、一阶线性微分方程、二阶线性微分方程微分方程的应用:常微分方程的物理应用、生物应用、经济应用4. 重积分二重积分:累次积分、极坐标系下的二重积分三重积分:累次积分、柱坐标系、球坐标系下的三重积分5. 线性代数行列式与矩阵:行列式的性质、矩阵的性质和运算线性方程组:线性方程组的解法、线性方程组的应用特征值与特征向量:矩阵的特征值和特征向量、对角化、相似矩阵二、离散数学1. 集合与命题逻辑集合:集合的基本概念、集合的运算、集合的应用命题逻辑:命题的联结词、等值命题、蕴含命题、充分必要条件2. 图论图的基本概念:图的定义、图的性质、图的应用连通性:连通图、强连通图、连通度、割点、桥图的着色问题:平面图的着色、四色定理3. 组合数学排列组合:排列、组合、二项式定理生成函数:普通生成函数、指数型生成函数容斥原理:二项式系数的应用、排列组合的应用4. 概率论随机事件与概率:随机试验、随机事件的概率、概率的性质随机变量与概率分布:随机变量的概念、离散型随机变量、连续型随机变量随机过程:马尔可夫链、泊松过程、布朗运动三、数学分析1. 泛函分析赋范空间:线性空间的内积、希尔伯特空间的定义线性算子:紧算子、自共轭算子巴拿赫空间:巴拿赫空间的性质和定理2. 复变函数复数和复变函数:复数的基本性质、复变函数的连续性和可导性积分定理:柯西积分定理、留数定理解析函数:正实部函数、调和函数、齐纯函数3. 实变函数度量空间:度量空间的性质、完备度量空间勒贝格积分:勒贝格积分的性质、勒贝格积分的应用广义积分:广义积分的收敛性、绝对收敛四、概率论与数理统计1. 随机变量随机变量的概念:离散型随机变量、连续型随机变量、随机变量的分布函数随机变量的数字特征:数学期望、方差、协方差2. 大数定律与中心极限定理大数定律:切比雪夫不等式、辛钦大数定律、伯努利大数定律中心极限定理:林德贝格-列维中心极限定理、中心极限定理的其他形式3. 参数估计与检验参数估计:点估计、区间估计假设检验:假设检验的基本思想、参数假设检验方差分析:单因素方差分析、双因素方差分析五、数理逻辑与模糊数学1. 数理逻辑命题逻辑:命题的联结词、等值命题、蕴含命题、充分必要条件谓词逻辑:一阶谓词逻辑、量词、谓词逻辑的推理规则2. 模糊数学模糊集合:模糊集合的基本概念、模糊集合的运算模糊关系:模糊关系的合成、模糊关系的反对称性模糊逻辑:模糊逻辑的蕴含、摩根定律、模糊逻辑的合取和析取以上是考研数学的知识点总结,希望对大家有所帮助。

图论双连通

图论双连通

图的割点、桥与双连通分支[点连通度与边连通度]在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。

一个图的点连通度的定义为,最小割点集合中的顶点数。

类似的,如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合。

一个图的边连通度的定义为,最小割边集合中的边数。

[双连通图、割点与桥]如果一个无向连通图的点连通度大于1,则称该图是点双连通的(point biconnected),简称双连通或重连通。

一个图有割点,当且仅当这个图的点连通度为1,则割点集合的唯一元素被称为割点(cut point),又叫关节点(articulation point)。

如果一个无向连通图的边连通度大于1,则称该图是边双连通的(edge biconnected),简称双连通或重连通。

一个图有桥,当且仅当这个图的边连通度为1,则割边集合的唯一元素被称为桥(bridge),又叫关节边(articulation edge)。

可以看出,点双连通与边双连通都可以简称为双连通,它们之间是有着某种联系的,下文中提到的双连通,均既可指点双连通,又可指边双连通。

[双连通分支]在图G的所有子图G'中,如果G'是双连通的,则称G'为双连通子图。

如果一个双连通子图G'它不是任何一个双连通子图的真子集,则G'为极大双连通子图。

双连通分支(biconnected component),或重连通分支,就是图的极大双连通子图。

特殊的,点双连通分支又叫做块。

[求割点与桥]该算法是R.Tarjan发明的。

对图深度优先搜索,定义DFS(u)为u在搜索树(以下简称为树)中被遍历到的次序号。

定义Low(u)为u或u的子树中能通过非父子边追溯到的最早的节点,即DFS序号最小的节点。

根据定义,则有:Low(u)=Min { DFS(u) DFS(v) (u,v)为后向边(返祖边) 等价于DFS(v)<DFS(u)且v 不为u的父亲节点Low(v) (u,v)为树枝边(父子边) }一个顶点u是割点,当且仅当满足(1)或(2) (1) u为树根,且u有多于一个子树。

POJ 题目整理

POJ 题目整理

初期:一.基本算法:(1)枚举. (poj1753,poj2965)(2)贪心(poj1328,poj2109,poj2586)(3)递归和分治法.(4)递推.(5)构造法.(poj3295)(6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:(1)图的深度优先遍历和广度优先遍历.(2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra)(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)(3)最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026)(4)拓扑排序 (poj1094)(5)二分图的最大匹配 (匈牙利算法) (poj3041,poj3020)(6)最大流的增广路算法(KM算法). (poj1459,poj3436)三.数据结构.(1)串 (poj1035,poj3080,poj1936)(2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299)(3)简单并查集的应用.(4)哈希表和二分查找等高效查找法(数的Hash,串的Hash)(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)(5)哈夫曼树(poj3253)(6)堆(7)trie树(静态建树、动态建树) (poj2513)四.简单搜索(1)深度优先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)(2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)(3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)五.动态规划(1)背包问题. (poj1837,poj1276)(2)型如下表的简单DP(可参考lrj的书 page149):1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列) (poj3176,poj1080,poj1159)3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)六.数学(1)组合数学:1.加法原理和乘法原理.2.排列组合.3.递推关系.(POJ3252,poj1850,poj1019,poj1942)(2)数论.1.素数与整除问题2.进制位.3.同余模运算.(poj2635, poj3292,poj1845,poj2115)(3)计算方法.1.二分法求解单调函数相关知识.(poj3273,poj3258,poj1905,poj3122)七.计算几何学.(1)几何公式.(2)叉积和点积的运用(如线段相交的判定,点到线段的距离等). (poj2031,poj1039)(3)多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交)(poj1408,poj1584)(4)凸包. (poj2187,poj1113)中级:一.基本算法:(1)C++的标准模版库的应用. (poj3096,poj3007)(2)较为复杂的模拟题的训练(poj3393,poj1472,poj3371,poj1027,poj2706)二.图算法:(1)差分约束系统的建立和求解. (poj1201,poj2983)(2)最小费用最大流(poj2516,poj2516,poj2195)(3)双连通分量(poj2942)(4)强连通分支及其缩点.(poj2186)(5)图的割边和割点(poj3352)(6)最小割模型、网络流规约(poj3308, )三.数据结构.(1)线段树. (poj2528,poj2828,poj2777,poj2886,poj2750)(2)静态二叉检索树. (poj2482,poj2352)(3)树状树组(poj1195,poj3321)(4)RMQ. (poj3264,poj3368)(5)并查集的高级应用. (poj1703,2492)(6)KMP算法. (poj1961,poj2406)四.搜索(1)最优化剪枝和可行性剪枝(2)搜索的技巧和优化 (poj3411,poj1724)(3)记忆化搜索(poj3373,poj1691)五.动态规划(1)较为复杂的动态规划(如动态规划解特别的施行商问题等) (poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)(2)记录状态的动态规划. (POJ3254,poj2411,poj1185)(3)树型动态规划(poj2057,poj1947,poj2486,poj3140)六.数学(1)组合数学:1.容斥原理.2.抽屉原理.3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).4.递推关系和母函数.(2)数学.1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)2.概率问题. (poj3071,poj3440)3.GCD、扩展的欧几里德(中国剩余定理) (poj3101)(3)计算方法.1.0/1分数规划. (poj2976)2.三分法求解单峰(单谷)的极值.3.矩阵法(poj3150,poj3422,poj3070)4.迭代逼近(poj3301)(4)随机化算法(poj3318,poj2454)(5)杂题. (poj1870,poj3296,poj3286,poj1095)七.计算几何学.(1)坐标离散化.(2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用).(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)(3)多边形的内核(半平面交)(poj3130,poj3335)(4)几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)高级:一.基本算法要求:(1)代码快速写成,精简但不失风格(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)(2)保证正确性和高效性. poj3434二.图算法:(1)度限制最小生成树和第K最短路. (poj1639)(2)最短路,最小生成树,二分图,最大流问题的相关理论(主要是模型建立和求解) (poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446) (3)最优比率生成树. (poj2728)(4)最小树形图(poj3164)(5)次小生成树.(6)无向图、有向图的最小环三.数据结构.(1)trie图的建立和应用. (poj2778)(2)LCA和RMQ问题(LCA(最近公共祖先问题) 有离线算法(并查集+dfs) 和在线算法(RMQ+dfs)).(poj1330)(3)双端队列和它的应用(维护一个单调的队列,常常在动态规划中起到优化状态转移的目的).(poj2823)(4)左偏树(可合并堆).(5)后缀树(非常有用的数据结构,也是赛区考题的热点). (poj3415,poj3294)四.搜索(1)较麻烦的搜索题目训练(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)(2)广搜的状态优化:利用M进制数存储状态、转化为串用hash表判重、按位压缩存储状态、双向广搜、A*算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)(3)深搜的优化:尽量用位运算、一定要加剪枝、函数参数尽可能少、层数不易过大、可以考虑双向搜索或者是轮换搜索、IDA*算法.(poj3131,poj2870,poj2286)五.动态规划(1)需要用数据结构优化的动态规划. (poj2754,poj3378,poj3017)(2)四边形不等式理论.(3)较难的状态DP(poj3133)六.数学(1)组合数学.1.MoBius反演(poj2888,poj2154)2.偏序关系理论.(2)博奕论.1.极大极小过程(poj3317,poj1085)2.Nim问题.七.计算几何学.(1)半平面求交(poj3384,poj2540)(2)可视图的建立(poj2966)(3)点集最小圆覆盖.(4)对踵点(poj2079)八.综合题.(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263) 以及补充Dp状态设计与方程总结1.不完全状态记录<1>青蛙过河问题<2>利用区间dp2.背包类问题<1> 0-1背包,经典问题<2>无限背包,经典问题<3>判定性背包问题<4>带附属关系的背包问题<5> + -1背包问题<6>双背包求最优值<7>构造三角形问题<8>带上下界限制的背包问题(012背包)3.线性的动态规划问题<1>积木游戏问题<2>决斗(判定性问题)<3>圆的最大多边形问题<4>统计单词个数问题<5>棋盘分割<6>日程安排问题<7>最小逼近问题(求出两数之比最接近某数/两数之和等于某数等等)<8>方块消除游戏(某区间可以连续消去求最大效益)<9>资源分配问题<10>数字三角形问题<11>漂亮的打印<12>邮局问题与构造答案<13>最高积木问题<14>两段连续和最大<15>2次幂和问题<16>N个数的最大M段子段和<17>交叉最大数问题4.判定性问题的dp(如判定整除、判定可达性等)<1>模K问题的dp<2>特殊的模K问题,求最大(最小)模K的数<3>变换数问题5.单调性优化的动态规划<1>1-SUM问题<2>2-SUM问题<3>序列划分问题(单调队列优化)6.剖分问题(多边形剖分/石子合并/圆的剖分/乘积最大)<1>凸多边形的三角剖分问题<2>乘积最大问题<3>多边形游戏(多边形边上是操作符,顶点有权值)<4>石子合并(N^3/N^2/NLogN各种优化)7.贪心的动态规划<1>最优装载问题<2>部分背包问题<3>乘船问题<4>贪心策略<5>双机调度问题Johnson算法8.状态dp<1>牛仔射击问题(博弈类)<2>哈密顿路径的状态dp<3>两支点天平平衡问题<4>一个有向图的最接近二部图9.树型dp<1>完美服务器问题(每个节点有3种状态)<2>小胖守皇宫问题<3>网络收费问题<4>树中漫游问题<5>树上的博弈<6>树的最大独立集问题<7>树的最大平衡值问题<8>构造树的最小环转一个搞ACM需要的掌握的算法.要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来.适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什么就眼红, 发挥自己的长处,这才是重要的.第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来.1.最短路(Floyd、Dijstra,BellmanFord)2.最小生成树(先写个prim,kruscal要用并查集,不好写)3.大数(高精度)加减乘除4.二分查找. (代码可在五行以内)5.叉乘、判线段相交、然后写个凸包.6.BFS、DFS,同时熟练hash表(要熟,要灵活,代码要简)7.数学上的有:辗转相除(两行内),线段交点、多角形面积公式.8. 调用系统的qsort, 技巧很多,慢慢掌握.9. 任意进制间的转换第二阶段:练习复杂一点,但也较常用的算法。

算法学习:图论之图的割点,桥,双连通分支

算法学习:图论之图的割点,桥,双连通分支

图的割点、桥与双连通分支[点连通度与边连通度]在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。

一个图的点连通度的定义为,最小割点集合中的顶点数。

类似的,如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合。

一个图的边连通度的定义为,最小割边集合中的边数。

注:以上定义的意思是,即有可能删除两个或两个以上点的时候才能形成多个连通块![双连通图、割点与桥]如果一个无向连通图的点连通度大于1,则称该图是点双连通的(point biconnected),简称双连通或重连通。

一个图有割点,当且仅当这个图的点连通度为1,则割点集合的唯一元素被称为割点(cut point),又叫关节点(articulation point)。

如果一个无向连通图的边连通度大于1,则称该图是边双连通的(edge biconnected),简称双连通或重连通。

一个图有桥,当且仅当这个图的边连通度为1,则割边集合的唯一元素被称为桥(bridge),又叫关节边(articulation edge)。

可以看出,点双连通与边双连通都可以简称为双连通,它们之间是有着某种联系的,下文中提到的双连通,均既可指点双连通,又可指边双连通。

[双连通分支]在图G的所有子图G’中,如果G’是双连通的,则称G’为双连通子图。

如果一个双连通子图G’它不是任何一个双连通子图的真子集,则G’为极大双连通子图。

双连通分支(biconnected component),或重连通分支,就是图的极大双连通子图。

特殊的,点双连通分支又叫做块。

[求割点与桥]该算法是R.Tarjan发明的。

对图深度优先搜索,定义DFS(u)为u在搜索树(以下简称为树)中被遍历到的次序号。

定义Low(u)为u或u的子树中能通过非父子边追溯到的最早的节点,即DFS序号最小的节点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。





把所有入度为0的点编号 0,1,2,3,4 ....N -1 为所有从编号为i的入度0点可达的出度0点,添加 一条出边,连到编号为(i+1)%N 的那个出度0点, 这需要加n条边


若 m <= n,则 加了这n条边后,已经没有入度0点,则问题解决 ,一共加了n条边
若 m > n,则还有m-n个入度0点,则从这些点以 外任取一点,和这些点都连上边,即可,这还需 加m-n条边。 所以,max(m,n)就是第二个问题的解
ACM1236: 解题思路


1. 求出所有强连通分量
2. 每个强连通分量缩成一点,则形成一个有 向无环图DAG。 3. DAG上面有多少个入度为0的顶点,问题1的 答案就是条边,才能使得DAG变成强连通 的,问题2的答案就是多少 加边的方法:
要为每个入度为0的点添加入边,为每个出度 为0的点添加出边 假定有 n 个入度为0的点,m个出度为0的点, 如何加边?
Tarjan 算法
Q:为什么要膜拜Tarjan? 1.DFS是Hopcroft和Tarjan提出的 2.今天介绍的求强连通分支的一个算法是 Tarjan提出的,被称为Tarjan算法 3.Tarjan对DFS做了大量研究,包括离线的 LCA算法和平面图判定算法都是使用了DFS的 经典算法
4.Tarjan是大牛!
当深搜过程中遇到一个分量,首先发现的顶点v肯定是树根, 由于分量是一棵子树,且分量间顶点可互达,那么其他顶点 肯定能由v 发起的路径到达,那么其他节点都是v的子孙。 定义dfn数组,dfn[u] 表示u在深度优先遍历中的序号 我们定义 low 数组,low[v] 表示,从v出发经过v 的子孙形成 的路径和一条回退边,能够到达的最浅层次的顶点的序号。 注意这里到达的顶点必须是可用的,我们说当一个分量完成, 其包括的顶点全部设置为不可用。其实如果边是一条不同子 树之间的横跨边,它到达的顶点肯定是不可用的,因为那个 点已经属于另一个分量。 参考:/lewutian/archive/2009/08/30/4499657.aspx
/Algorithm/ShowArticle.asp?ArticleID=58
(a)为有向图G, 其中的阴影部分 是G的强连通分 支,对每个顶点 都标出了其发现 时刻与完成时刻 ,黑色边为深度 优先搜索的树 枝; (b)G的转置图GT 依次以b,c,g,h 为起点做DFS, 得到4个强连通 分量
给定一个有向图,求有多少个顶点是由任何顶 点出发都可达的。
顶点数<= 10,000,边数 <= 50,000

有用的定理:
有向无环图中唯一出度为0的点,一定可 以由任何点出发均可达(由于无环,所 以从任何点出发往前走,必然终止于 一个出度为0的点)
ACM2186: 解题思路


1. 求出所有强连通分量



tarjan(u) { DFN[u]=Low[u]=++time // 为节点u设定次序编号和Low初值 Stack.push(u) // 将节点u压入栈中 for each (u, v) in E // 枚举每一条边 if (v is not visted) // 如果节点v未被访问过 tarjan(v) // 继续向下找 Low[u] = min(Low[u], Low[v]) else if (v in Stack ) // 如果节点u还在栈内 Low[u] = min(Low[u], DFN[v]) //Low[u] = min(Low[u],Low[v]) 可否? if (DFN[u] == Low[u]) // 如果节点u是强连通分量的根 repeat v = Stack.pop // v为该强连通分量中的一个顶点 print v until (u== v) }
在dfs过程中,遇到新点令其dfn[u] = low[u] =当前遍历序 号 . 回溯时,如果发现dfn[u] == low[u], 则u是分量子树的 树根。 这是一个充要条件。 -->: 如果u 是树根,且由于 是强分量,其子孙都可达到u, 则子孙的low 都是u 的编号。 则low[u] = dfn[u]. <--: 如果low[u] == dfn[u], 假设u不是 树根,那么肯定有u的祖先是树根,那么low[u]肯定比当前 值小,矛盾,因此u是树根。 如何取出分量? 我们遇到新顶点时将顶点入栈,在回溯 时发现了根,且根是先被压入栈的,那么在根之后压入的 顶点都是分量中的顶点,否则如果有顶点属于其他分量, 就出现矛盾,因为在那个分量完成时,这个顶点已经弹出 不可用了。
算法复杂度分析
深度优先搜索的复杂度:Θ(V + E) 计算GT的复杂度:0或者Θ(V + E)(临接表) 所以总的复杂度为:Θ(V + E) 非常好的算法!

Kosaraju's algorithm

思考:Professor Deaver声称,用于强 连通分支的算法可以这样简化,即在第 二次深度优先搜索中使用原图(而不是 其转置图),并按完成时间递增的顺序 来扫描各个节点。这位教授的说法正确 么?


其他题目

acm1236,acm3180,acm2762(强连通+拓扑排 序),acm2553,acm3114(强连通 +dijkstra), acm3160(强连通+DP)
参考: /blog/scc-tarjan/
Tarjan算法是基于对图深度优先搜索的算法,每个强连通分 量为搜索树中的一棵子树。既然强连通分量是深搜树的一棵 子树,要找到一个分量,只要找到树根( 连接不同分量的桥 的前端顶点) ,然后取出其所属分量的顶点即可。

Korasaju算法


procedure Strongly_Connected_Components(G); begin 1.深度优先遍历G,算出每个结点u的结束时间f[u],起 点如何选择无所谓。 2.深度优先遍历G的转置图GT,选择遍历的起点时, 按照结点的结束时间从大到小进行。遍历的过程中, 一边遍历,一边给结点做分类标记,每找到一个新的 起点,分类标记值就加1。 3. 第2步中产生的标记值相同的结点构成深度优先森 林中的一棵树,也即一个强连通分量 end; 证明参考:
ACM1236: Network of Schools

给定一个有向图,求:
1) 至少要选几个顶点,才能做到从这些顶点出 发,可以到达全部顶点 2) 至少要加多少条边,才能使得从任何一个顶 点出发,都能到达全部顶点

顶点数<= 100
有用的定理:
有向无环图中所有入度不为0的点,一定 可以由某个入度为0的点出发可达。 (由于无环,所以从任何入度不为0的 点往回走,必然终止于一个入度为0的 点)
两个算法的分析比较
1.都是很巧妙的算法 2.都很快 3.Tarjan的算法一般来说要快30%,因 为只需要一遍DFS,同时,这种找DFS 搜索树中的反向边的想法在别的地方也 很有用。包括:

◦ 证明并查集时间复杂度 ◦ 求桥或者割点 ◦ 树形DP
ACM2186:Popular Cows

有向图的强连通分支
本讲义部分内容引用北京大学信息学院实验班袁洋、陈科吉同学讲义, 特此致谢
定 义

在有向图G中,如果任意两个不同的顶点 相互可达,则称该有向图是强连通的。 有向图G的极大强连通子图称为G的强连 通分支。
转置图的定义:将有向图G中的每一条 边反向形成的图称为G的转置GT。(注 意到原图和GT的强连通分支是一样的)
2. 每个强连通分量缩成一点,则形成一个有 向无环图DAG。 3. DAG上面如果有唯一的出度为0的点,则该点 能被所有的点可达。那么该点所代表的连通分 量上的所有的原图中的点,都能被原图中的所 有点可达,则该连通分量的点数,就是答案。


4. DAG上面如果有不止一个出度为0的点,则 这些点互相不可达,原问题无解,答案为0
ACM1236: Network of Schools

题目大意:N(2<N<100)各学校之间有单向的 网络,每个学校得到一套软件后,可以通过单 向网络向周边的学校传输,问题1:初始至少 需要向多少个学校发放软件,使得网络内所有 的学校最终都能得到软件。2,至少需要添加 几条传输线路(边),使任意向一个学校发放软 件后,经过若干次传送,网络内所有的学校最 终都能得到软件。
相关文档
最新文档