1、1,图论常见模型与思想,何亮 ,2,强连通分量相关,概念:有向图的强连通分量(SCC)是指,对于强连通分量里面的任意两个点u,v,都存在从u到v的路和从v到u的路 算法:复杂度均为O(V+E) Kosaraju (两次dfs) Tarjan / Gabow (一次dfs),3,Tarjan,对图进行DFS,每个SCC都是DFS树的一个子树。在搜索时用堆栈维护当前正在处理的结点,栈顶的若干元素即组成一个SCC。 类似求割点的过程,定义Lowu = min(dfnu, lowv, (u,v)为树边dfnv, (u,v)为后向边 ) 若对某点u有 dfnu = lowu,说明以u为根的子树上的点为一
2、个SCC,4,tarjan(u) DFNu=Lowu=+Index / 为u设定dfn和Low初值 Stack.push(u) / 将节点u压入栈中for each (u, v) in E / 枚举每一条边 if (v is not visted) / 如果节点v未被访问过(树边)tarjan(v) / 继续向下找 Lowu = min(Lowu, Lowv) else if (v in S) / 如果节点u还在栈内(后向边)Lowu = min(Lowu, DFNv) if (DFNu = Lowu) / 节点u是SCC的根repeat v = S.pop / 将v退栈,为该SCC中一个顶点
3、print v until (u= v) ,5,6,7,8,9,强连通分量相关,关键点: 一个强连通分量内部的所有点,在某种意义上是“等价”的。 图中的边存在某种意义上的“传递性”。 通过缩点操作可以把复杂的一般有向图转化为DAG,使得问题简化,10,例题分析,Popular Cows (USACO Fall 03) POJ 2186 N头奶牛,给出若干个欢迎关系A B,表示A欢迎B,欢迎关系是单向的,但是是可以传递的。另外每个奶牛都是欢迎他自己的。求出被所有的奶牛欢迎的奶牛的数目。 奶牛数目N10000 直接的欢迎关系数目M50000,11,例题分析,如果A欢迎B,就连一条从A到B的有向边
4、容易发现,在同一个强连通分量里的点具有同样的“受欢迎程度”:能够到达它们的点集是相同的,从它们出发能够到达的点集也是相同的。 我们求出原图的强连通分量,然后收缩,12,例题分析,容易发现,新图中唯一的出度为0的点即为所求。 因为新图不含有环,这样的点一定存在。 如果出度为0的点不唯一则无解。时间复杂度 O(E),13,例题分析,WTommys Trouble(TOJ2233/TOI 1135) WTommy需要向所有人通知某件事情,因为人数众多,他想出了一个省力的方法:他只通知队中的某些人,然后让这些人去通知所有他们认识的人,这些新被通知的人又去通知更多的人直到最后队中的所有人都被通知到。 给
5、定最初时WTommy通知每个人所需的花费,现在他想求出一种方案,使得花费最少,并且保证最终所有人都能被通知到。,14,例题分析,Input 4 3 30 20 10 40 1 2 2 1 2 3 Output : 60,1 N 10000, 0 M 200000,15,例题分析,同一个强连通分量里,只要有一人被通知即可 缩点后得到的DAG中,如果一个点被通知,则它的所有后继结点都会被通知。故只需通知入度为0的点 在入度为0的每个点所表示的连通分量中,通知花费最少的那个人,即为最优解 O(E),16,例题分析,NOIP 2009 最优贸易(Trade) C 国有 n 个大城市和 m 条道路(单向
6、或双向),每条道路连接这 n 个城市中的某两个城市。水晶球在各地有不同的价格。某商人准备从1走到n(任何城市可以经过多次),在某个城市买入,并在另一城市卖出,收益即为价格之差。他最多只买入和卖出1次,求最大收益。,17,例题分析,如下图,五城市水晶球价格分别为 4,3,5,6,1 。则最高的方案是14545。在第一次到5时买入,第二次到4时卖出,收益为6 1 = 5,18,例题分析,若图中无环,则可以DP求解: 设vi表示i点的物品价格。令dpi表示从i到N的路径中的最高价格。若从i点买入,则收益为dpi-vi。最终结果即为max(dpi-vi) 状态转移方程: dpi = max(vi, m
7、axdpj, 当ij有边时)注意:应排除不能到达N的点,19,例题分析,若图中有环 在同一SCC里的全部点的“连通性”是等价的:能够到达它们的点集是相同的,从它们出发能够到达的点集也是相同的。 若从此SCC买入,则一定买价格最低的点 若从此SCC卖出,则一定买价格最高的点,20,例题分析,最终解法: 对原图求SCC并缩点,设新点i中最高价格点为Hi,最低价格点为Li。在新的DAG图上有DP: dpi = max(Hi, maxdpj, 当ij有边时) 最终结果为maxdpi Li注意:应排除不能到达N的点,21,例题分析,Poly-time Reductions(Hefei 2008) 给定一
8、个有向图G,求一个包含最少边的有向图G,使G和G的传递闭包相同。 图的传递闭包是指,若存在边AB, BC,则必存在边AC N = 100, M = 10000,22,例题分析,Input 3 3 1 2 2 3 1 3 Output 2,Input 4 6 1 2 2 1 2 3 3 2 3 4 4 3 Output 4,23,例题分析,求强连通分量,缩点在同一强连通分量内部,最少需要几条边?不同分量之间的边,有哪一种是不必要的?,24,例题分析,先求传递闭包 对于边(u,v),若存在一点k,使得uk且kv,则边(u,v)是不必要的 易得一个O(n3)的算法证明?,25,路径覆盖相关,经典模型
9、:给定一有向无环图,要求用最少的不相交路径把所有点覆盖上 解法:把原图中的每个点i拆为两个,分别属于X集和Y集。对于原图中的有向边(i,j),在新图中添加边(Xi, Yj),得到一个二分图。最小路径覆盖数 = 原图顶点数 新图最大匹配数 “拆点”思路广泛应用于此类问题,26,路径覆盖相关,简单解释: 原图的路径覆盖和新图的匹配间有对应关系:每条覆盖边都是匹配中的一条边,且只有路径的最后一个点没有被匹配上。 路径要求不能相交,恰好对应于匹配中两匹配边不能有公共端点。 于是求最大匹配后,不能被匹配上的点,即是路径的最后一个点。有多少个不能被匹配的点,就有多少条路径存在。路径数=原点数匹配边数。因此
10、我们使匹配边数最大,即是使路径数最小。,27,例题分析,Hanoi Tower Troubles Again! (OIBH Contest) ZOJ 1239 题目大意:给定柱子数N,按编号从小到大放球,要求:如果该球不在最底数,则该球和它下面一个球的编号之和必须为完全平方数。 问对于给定的N,最多能放多少球上去。 N=50,28,例题分析,29,例题分析,考虑一下相关的问题: 给k个球,问最少需要多少个柱子才能把它们都放上? 如果能解出上述问题,则二分k值即可求解原问题。继续类比球?, 柱子?,30,例题分析,如果a+b是完全平方数(ab),那么我们连一条有向边(a,b) 于是,问题变成了求
11、DAG的最小路径覆盖。 因为连边时保证ab,所以无环 路径柱子 路径不相交同一个球不能用两次 ,31,例题分析,POJ Monthly / POJ 3216 题目大意:城市有Q个城区,有些城区之间有路连接,经过这些路所需时间已知。现在有M个维修任务要进行,已知每个任务的地点、deadline和完成每个任务所需时间。维修工可以从任何一个城区开始,完成任务后可以到另一个城区继续。问至少要派出多少个维修工才能及时任务。(Q=20, M=200),32,例题分析,Sample Input 1 2 0 1 1 10 1 5 10,Sample Output2,33,例题分析,Floyd预处理所有点对间最
12、短路径dis设有任务a,b,如果在完成任务a后还来得及走到b处继续,即deadlinea + cost + disab = deadlineb,则连一条有向边(a,b),34,例题分析,由建图的过程知,这个有向图中一定不会出现环于是问题转化为DAG的最小路径覆盖 经典问题,(点数-最大匹配数)即为最终结果。,35,Dilworth定理,NOIP 1999 导弹拦截 导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 给定依次飞来的导弹高度,问(1)一套系统最多拦截多少导弹 (2)拦截所有导弹最少需要几套系统,36,Dilworth定理,第一
13、问是简单的最长不上升子序列O(nlogn) 第二问 解法一:最小路径覆盖 (复杂度过高) 解法二:贪心?,37,Dilworth定理,偏序关系:定义在集合X上的二元关系,对X中任意元素a,b,c满足三条性质: 1. 自反性:aa 2. 反对称性:若ab且ba,则a=b 3. 传递性:若ab且bc,则ac 对于X中任意两元素a,b,若有ab或ba,则称a和b是可比的,否则为不可比。,38,Dilworth定理,一个链C是X的一个子集,它的任意两个元素都可比。 一个反链A是X的一个子集,它的任意两个元素都不能进行比较。Dilworth定理: 最大反链的大小 = 最少可划分成的链的数目,39,Dil
14、worth定理,若在拦截导弹a以后还能拦截导弹b,则认为存在关系ab(易得此为偏序关系) 问题一:求最大链 问题二:求最少划分成多少个链。由Dilworth定理,等价于求最大的反链 在此处,最大的反链,即最长上升子序列 O(nlogn),40,Dilworth定理,思考: 能用dilworth定理解决的问题一定能用路径覆盖解决吗? 反之是否成立?什么情况下只能用匹配来做?,41,Dilworth定理,HDU 3335 Divisibility 给定n个数(n=1000),要求从中选出一些数,满足条件:若选择了a,就不能选择任何a的约数和倍数。问最多能选出多少数例如有三个数1,2,3,最多可以选
15、出两个: 2,3,42,Dilworth定理,(a是b的倍数)这是一个偏序关系,则此题要求的即为最大反链的大小 此题中反链难以直接计算,利用Dilworth定理,等价于计算最少可划分为的链数 于是我们回到最小路径覆盖,用二分匹配求解即可,43,例题分析,TJOI 2009 细菌培养 生物实验室的培养皿中有N只细菌,每只细菌i有三个属性值Ai,Bi,Ci,若细菌i和j发生接触,并且细菌i的三项属性值都大于或等于细菌j时,i就可以把j吞噬掉。由于某些神秘的原因,每只细菌最多只能吞噬K只细菌。问培养皿中最少会剩下多少只细菌?,44,例题分析,Input: 3 1 10 20 30 10 20 30
16、10 20 30Output: 1,Input 4 2 100 100 100 50 50 50 40 50 60 10 100 200 Output 2,45,广义的路径覆盖,不考虑三个属性完全相等的情况,如果当i可以吃掉j时连有向边ij,那么可以得到一个DAG 若K=1,则此问题即为DAG的最小路径覆盖 若K1 ?,46,广义的路径覆盖,类比K=1的情况,不同之处在于,每个左边的点可以匹配多个右边的点,于是 把每个点i拆成两个点i和i 若i能吃掉j,连边(ij),容量为1 从源点到每个左侧点i连边,容量为K 从每个右侧点i到汇点连边,容量为1 求最大流F,则n-F即为所求,47,广义的路径
17、覆盖,对于属性完全相同的细菌,因为是完全等价,我们可以任意设定一个顺序,例如,以在输入数据中出现的先后顺序为序,只允许排前面的细菌吃掉排后面的细菌。,48,SPOJ TOURS,有N个城市M条单向道路,道路有长度权值。要求设计出若干条环线,使得每个城市都属于(且仅属于)一条环线。每条环线最少包含两个城市,且经过每个城市最多一次。要求所有环线的总长度之和最小。N = 200,49,SPOJ TOURS,Input: 5 8 1 2 4 2 1 7 1 3 10 3 2 10 3 4 10 4 5 10 5 3 10 5 4 3,Output: 40两条环线: 1 3 2 1 5 4 5,50,广
18、义的路径覆盖,思考: 环覆盖? 与路径覆盖有何区别与联系?可否借用类似的思路?,51,广义的路径覆盖,把每个点拆成两个点,按同样方法得到二分图,我们发现一个环覆盖的方案恰好对应一个完美匹配。 于是原问题转化为二分图带权匹配。思考:此方法能否用来解决Hamilton回路问题或TSP问题?,52,例题分析,TC SRM 435 Level 3 题目大意是,某公司计划重组管理结构,使所有人员形成一个“森林”状结构,即若干树的集合,每个人只属于一棵树,也就是每个人至多有一个上司,要求树的个数尽可能少。这个公司在之前曾有过一些暂时管理关系,比如A曾经暂时管理过B,B可能也暂时管理过A。如果A暂时管理过B
19、,那么A就认为他比B优秀,而且这种优越感是可传递的,即如果A管理过B,B管理过C,则A也认为他比C优秀。如果A认为自己比B优秀,B也认为自己比A优秀,就说两个人有“互斥优越感”。,53,例题分析,现在要求重组后得到的森林状结构满足: 1. 任何人的下属应该是他曾经管理过的人。 2. 不应有任何人认为他比自己的直接上司优秀。 3. 有“互斥优越感”的人不应当有同一个上司。复杂的条件,奇怪的约束,如何下手?_,54,例题分析,Ans = 1 Ans = 1 Ans = 4,3,0,1,2,3,0,1,2,3,0,1,2,55,例题分析,如果A曾经管理B,我们就连有向边(A, B),那么“互斥优越感
20、”这个东西很容易让人想到强连通分量,一个SCC内部的所有人都是互斥的。 我们首先考虑每个SCC只有一个点的情况,这时候图是一个有向无环图(DAG),类比DAG上的最小路径覆盖问题,这题我们求的是“最小树覆盖”,56,例题分析,在一个“树覆盖”里,除了根,所有的点都有一个入边。我们要使尽可能多的点有一个入边,且不破坏条件3,即同一个连通分量中所有的点的“父亲”是不同的点。,57,例题分析,对每个SCC作匹配,左边是SCC外的点,右边是SCC内的点,求最大匹配,剩下的没被匹配上的右边的点就不得不做为根 所有SCC里没匹配上的点的总和即为所求,58,二分图交错增广路相关,交错增广路是求二分图时的一个
21、概念 表示从左侧X集开始,交替经过 未匹配边 已匹配边 未匹配边 已匹配边 未匹配边 的过程。 若交错路的两端均为未匹配边,说明找到一条可增广路(此时必停在右侧Y集),此时可以通过交换匹配边和未匹配边,使匹配数+1,59,NOI 2009 Transform,N = 10000 Sample Input: 51 1 2 2 1 Sample Output: 1 2 4 0 3,60,NOI 2009 Transform,建立二分图,左右各有N个点,若i点经变换后可能到达j,则在左边的i和右边的j之间相边。 问题即为求此图的字典序最小的完美匹配,61,NOI 2009 Transform,如何保
22、证字典序最小? 方法一:依次穷举 由题意知每个左边点最多与两个右边点相连。从0点开始,假设0点与右边两点中较小点相连,检验剩下图是否仍有完美匹配。若无,则说明0应连另一点。对1点,2点继续此过程。 复杂度O(n3),62,NOI 2009 Transform,方法二:调整 首先求一个完美匹配。然后从左边编号最小的点开始,依次判断每个顶点的对应。如果当前顶点对应的点是序号较小顶点,可以直接取得,否则尝试修正。修正的方法是强制将当前顶点对应到另一个序号较小顶点,这必然导致X集合中另一个顶点失配,此时从该顶点开始尝试找一条增广路,如果存在则修正成功,否则修正失败,撤回操作。 复杂度O(n2),63,
23、NOI 2009 Transform,方法三:贪心 Step1. 对于左边或右边度为1的点,其匹配方式是唯一确定的。可以将其依次确定并将对应的边删除,这样可能再次出现度为1的点,重复此过程直至不能继续。 Step2. 此时左边所有的点度均为2。因为左右点数相等,右边的点度也必均为2,64,NOI 2009 Transform,Step2. 当所有点的度都为2时,这是一个环环上的完美匹配只有两种,所以可以非常简单地确定结果。 复杂度O(n),65,例题分析,Snake (TJOI 2008) 给定棋盘,A指定棋子的起始位置,B把棋子向相邻格子移动一步,然后双方轮流移动,棋子不能经过以前到过的位置
24、。不能移动的一方为负。,66,例题分析,黑白染色得到二分图。 A必胜当且仅当图中不存在完备匹配。A的策略:求出图的最大匹配,把棋子放在一个未匹配点x。则B的下步一定会把棋子移到一个已匹配点y(why?),然后A再把棋子移到在最大匹配中y的对应点,67,例题分析,从x出发不存在交错路 最后必然是B无路可走反之,若图中存在完美匹配,A必须把棋子放在已匹配点x,则B移动到与x匹配的点yB必胜,68,例题分析,Board Game (TOJ 2306) 两个棋子,初始位置给定。双方轮流走,每次只能选择一个棋子移动一步。棋子不能走回重复的位置。即四元组(x1,y1,x2,y2)不能重复。,69,例题分析,4 4 P.# # # #.P 先手胜,1 5 P.P 后手胜,70,例题分析,以x1+y1+x2+y2的奇偶性分类,仍得到二分图。 起点确定? 求最大匹配,若起点未被匹配,则后手必胜。 若起点被匹配上?,71,例题分析,72,例题分析,匹配并不唯一,只要存在一种令起点未被匹配的最大匹配,则后手必胜。方法1:从起点开始找偶数长度“增广路” 方法2:把起点删除再做匹配,检查是否和原匹配大小相等,