650 likes | 878 Views
图论. 天津大学. 简介. 起源 基本定义:点,边,权,树 常见问题:图的遍历(连通性问题,割点割边,强联通分量,拓扑排序, 2-SAT ,欧拉回路);最小生成树(次小生成树,最小度限制生成树);最短路径(差分约束);二分图匹配;网络流等等。. 图的遍历. 方法: 广度优先搜索( BFS ) - 队列 深度优先搜索( DFS ) - 堆栈. 图的遍历. 连通性问题: BFS/DFS Floyd 方法. 图的遍历. 拓扑排序(为其他算法做准备); 割点割边的求法; 两遍 DFS 求强联通分量( 2-SAT 问题)。. 最小生成树. 什么是最小生成树?
E N D
图论 天津大学
简介 • 起源 • 基本定义:点,边,权,树 • 常见问题:图的遍历(连通性问题,割点割边,强联通分量,拓扑排序,2-SAT,欧拉回路);最小生成树(次小生成树,最小度限制生成树);最短路径(差分约束);二分图匹配;网络流等等。
图的遍历 • 方法: • 广度优先搜索(BFS)-队列 • 深度优先搜索(DFS)-堆栈
图的遍历 • 连通性问题: • BFS/DFS • Floyd方法
图的遍历 • 拓扑排序(为其他算法做准备); • 割点割边的求法; • 两遍DFS求强联通分量(2-SAT问题)。
最小生成树 • 什么是最小生成树? • 求最小生成树的算法: • Kruskal算法 • Prim算法 • 算法流程?
最小生成树 • 复杂度: • Kruskal算法:O(ElgV) • Prim算法: • 一般方法:O(V2) • 使用堆:O(E + VlgV)
最小生成树 • 算法的选择: • 从图的稀疏程度考虑 • 从问题对边的限制考虑
最小生成树 • 例一:Toj 2172 Qiushi Bookstore • 求实书店中有m本书,有n种方式可以把两本书凑成“一套”。每本书原价一元,如果我已经有了“一套”书的其中一本,那么我买另一本时就可以获得一定的折扣。给出所有能够凑成“一套”的两本书和这套书可以获得的折扣,求买下所有的书最少需要多少钱。注意每本书只能打一次折。
最小生成树 • 分析: • 可以把书看成图的节点,折扣看成边。 • 图可能不联通。 • 图的每个连通分量中至少有一个节点是要花一块钱买的。
最小生成树 • 怎样把问题转化成最小生成树? • 怎样证明正确性。
最小生成树 • M, N (M ≤ 5000, N ≤ 50000) • 输入数据中给出了每条边的描述。 • 选择哪种算法?
最小生成树 • 例二:北极的某区域共有n座村庄( 1 < n < 500 ),每座村庄的坐标用一对整数(x, y)表示,其中 0 < x, y < 10000。为了加强联系,决定在村庄之间建立通讯网络。通讯工具可以是无线电收发机,也可以是卫星设备。所有的村庄都可以拥有一部无线电收发机, 且所有的无线电收发机型号相同。但卫星设备数量有限,只能给一部分村庄配备卫星设备。不同型号的无线电收发机有一个不同的参数d,两座村庄之间的距离如果不超过d就可以用该型号的无线电收发机直接通讯,d值越大的型号价格越贵。拥有卫星设备的两座村庄无论相距多远都可以直接通讯。请问如何分配k台卫星设备,才能使所拥有的无线电收发机的d值最小,并保证每两座村庄之间都可以直接或间接地通讯。
最小生成树: • 最小生成树的第k大边即为所求。 • 证明?类似Kruscal算法 • K个卫星设备可以将k个联通分量连在一起。 • 取最小生成树的第k大边是可行的,因为去掉最小生成树中最大的k-1条边后,图中有k个连通分量。 • 如果d比最小生成树中第k长的边小的话,最小生成树至少被分割成为k+1部分,原图也至少被分割成为k+1部分。
最小生成树 • 例三:机器人 • 预想中的机器人将经过的路线应在由平行的墙构成的走廊中,而且走廊只能有90度拐角。走廊从X 轴正方向开始。障碍物是柱子,由点表示,且都在走廊的两墙间。为了使机器人能够通过那条路,盘子不能碰到柱子或墙——只有盘子的边缘能“靠”到他们。机器人和他的盘子只能在X 轴或Y 轴方向平移。假定机器人的尺寸小于盘子尺寸且机器人一直完全处于盘子下方。
最小生成树 • 在什么情况下机器人会碰到障碍物。(考虑正方形重心和障碍物点之间的坐标) • 什么情况下机器人不能通过。
最小生成树 • 把机器人看作点,把障碍物看作正方形。
最小生成树 • 要让一个点通不过,唯一的办法就是用障碍物把走廊堵住。这里的“堵住”就是说障碍物将在走廊的两堵墙之间形成一条通路。
最小生成树 • 两个障碍物点相连的条件 • 障碍物和墙相连的条件
最小生成树 • 把障碍物和墙壁看作图中的点,两点之间边的权值可以这样求得:定义两个点p1(x1,y1)和p2(x2,y2)的距离为max{|x1-x2|,|y1-y2|},障碍物的距离就是障碍点的距离;障碍物与墙壁的距离就是障碍点与墙壁上所有点的距离的最小值;两堵墙之间的距离就是走廊的最小宽度。
最小生成树 • 把墙壁看作起点和终点,那么从起点到终点的一条路径可以看作一道障碍。 • 机器人能够通过一道障碍的条件是什么?
最小生成树 • 路径上最长边的长度必须大于机器人的宽度。 • 机器人能通过所有的障碍,那么所有路径的最长边必须大于机器人的宽度。
最小生成树 • 求最小生成树,最小生成树中起点和终点路径上的最长边即为所求。 • 证明?仍然类似于Kruscal算法。
次小生成树 设G=(V, E)是一个连通无向图,在其上定义了权值函数w:E→R,并假设|E| ≥ |V|,且所有边的权值是不同的。 • 假设T为G的最小生成树集合,并设T’为T的最小生成树,那么次小生成树是集合T’-T 中权值最小的生成树。
次小生成树 • 设T是G的一棵最小生成树,那么存在边(u, v) ∈ T,和不属于最小生成树的边(x, y),使得T – (u, v) + (x, y)是次小生成树。 • 证明?反证法
次小生成树 • 求次小生成树的算法: • 求最小生成树; • 以每个节点为根做一次DFS,记录其他顶点到根节点路径上的最大边,最终将得到任意两点间路径上的最大边max(x, y)。 • 枚举非树边(x, y)找到使w(x, y) – max(x, y)最小的那个边,把它加入到树中,并把最大的边去掉。
最小度限制生成树 • 对于一个加权的无向图,存在一些满足下面性质的生成树:某个特殊的结点的度等于一个指定的数值。最小度限制生成树就是满足此性质且权值和最小的一棵生成树。
最小度限制生成树 • 比如前面通信的那道题,可以通过引入虚拟节点转化为最小度限制生成树问题。
最小度限制生成树 • 数学定义:设G=(V,E,ω)是连通的无向图,v0 ∈V是特别指定的一个顶点,k为给定的一个正整数。如果T是G的一个生成树且dT(v0)=k,则称T为G的k度限制生成树。G中权值和最小的k度限制生成树称为G的最小k度生成树。
最小度限制生成树 • 将v0及与之相关联的边从途中去掉,得到图G’,假设G’有m个联通分支,那么当m > k时,问题无解; • 求每个连通分支的最小生成树; • 在与v0相关联的边中选出m条边,分别与每个联通分量相连,并使这m条边权值之和最小。从而得到了v0的m度限制生成树; • 把v0当作生成树的根,求每个节点到根的路径上的最大边(不包括与v0相临的边)及其权值记作max(v); • 检查所有与v0相连且不在生成树中的边,然后去掉原生成树中从v0到u的权值最大的那条边,添加v0u,令v0u-max(u)最小就得到G的最小m+1度限制生成树; • 重复以上两步,知道求出k度限制生成树。
最短路径 • 常用算法: • Dijkstra算法 (单源最短路径) • Floyd算法(任意两点间) • Bellman-Ford算法(单源最短路径) • SPFA算法(单源最短路径)
最短路径 • 算法流程? • 复杂度: • Dijkstra: O(V2)或O(E+VlgV) • Bellman-Ford: O(EV) • Floyd: O(V3) • SPFA: 期望复杂度O(E)
最短路径 • 算法选择: • 编程复杂度:Bellman-Ford<Floyd<Dijkstra • 时间复杂度:Dijkstra<Bellman-Ford • 使用范围:有负权边需要使用Bellman-Ford • 如果是稀疏图,即使是求任意两点间最短路径,也最好选用堆优化的Dijkstra。
最短路径 • 例一:给定含有n个顶点的带权无向图,一共可以进行m次操作,每次操作将一条边的权值除以2。问每次应该对哪条边进行操作,使得1到n的最短路径权和最小。(1≤n≤50,1≤m≤10)
最短路径 • 把图分为m层,如果原图中有一条边uv,权值为w(uv),那么在第i层和存在两条权值为w(uv)的有向边uivi和viui,在第i层和第j层(j > i)之间存在两条有向边uivi+1和ui+1vi,权值为w(uv)/2j-i。
最短路径 • 求从第1层的1号到第m+1行的n号节点的最短路径。
最短路径 • 差分约束模型: • 由若干个Xi – Xj ≤ bk形式的简单线性不等式,求满足这一系列不等式的一组解。
最短路径 • 关于差分约束的一个引理: • 设x=(X1, X2, …, Xn)是一个差分约束系统Ax≤b的一个解,d为任意常数,则x+d= =(X1+d, X2+d, …, Xn+d)也是该系统的一个解。
最短路径 • 约束图: • 给定一个差分约束系统,相应的约束图是一个带权有向图G=(V, E),其中V={v0, V1, …, Vn},而且E = {(vi, vj): xj-xi≤bk是一个约束} ∪{(v0, v1), (v0, v2), …, (v0, vn)} 。引入附加节点v0是为了保证其他每个节点均从v0可达。因此,顶点集合V由对应于每个未知量xi的定点vi和附加顶点v0组成。边的集合E有对应于每个差分约束条件的边与对应于每个未知量xi的边(v0, vi)所构成。如果xj-xi≤bk是一个约束条件,则边(vi, vj)的权w(vi, vj)=bk。从v0出发的边权值均为0。
最短路径 • 从约束图求差分约束问题的解: • 给定一差分约束系统,设G=(V, E)为其对应的约束图。如果G不包含负权回路,那么x=(mincost[v0][v1], mincost[v0][v2], …, mincost[v0][vn])是此系统的一个解。如果G包含负权贿赂,那么此系统不存在可行解。
最短路径 • 例题:猜数游戏 • A和B在玩猜数游戏,A告诉B他写好了n个非负数,然后告诉B一些这样的信息:第i个数减去第j个数大于等于某个正整数k。问使得所有这n个整数之和最小的一组解是什么。
最短路径 • xi– xj ≥ bk • (-xi) – (-xj) ≤ bk • 构图
二分图 • 什么是二分图? • 二分图匹配的定义。 • 二分图的经典应用: • 棋盘上的非攻击车 • 棋盘覆盖问题 • 职位分配
二分图 • 求二分图最大匹配的匈牙利算法 • 最大匹配数=最小点覆盖数 • 最大匹配+最小路径覆盖数=节点总数
二分图 • 匈牙利算法求最大匹配: • 假定现在已经有一组匹配M(两组顶点分别为X和Y) • 如果所有的定点都在M中,则已经匹配完毕,结束; • 寻找一个尚未匹配的定点x(属于X); • 找一个顶点y(属于Y),y不在M中,并且寻找一条从x到y的路径V; • 对于路径V作如下修改:若某边不在M中,则把改变添加到M中,若某边已经在M中,则把这条边去掉。
二分图 • 例一:任务安排 • 有两台机器A和B以及N个需要运行的任务。每台机器有M种不同的模式,而每个任务i都恰好在一台机器上运行。如果它在机器A上运行,则机器A需要设置为模式ai,如果它在机器B上运行,则机器B需要设置为模式bi。每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重新启动一次。请合理为每个任务安排一台机器并合理安排顺序,使机器重启次数尽量少。
二分图 • 把两台机器的工作模式看成顶点,如果一个工作在第一台机器上用模式i完成,在第二台机器上用模式j完成,那么就用一条边把这两个顶点连接起来,这样对于所的边,他们都有一个顶点是机器1的工作模式,另一顶点是机器2的工作模式,于是构成的图是个二分图。题目要求用最少的模式完成所有的工作,就相当于在图中用最少的点覆盖所有的边(因为点代表模式,边代表工作)。最小覆盖数=最大匹配数。
二分图 • 某国有n个城镇,m条单向铁路。每条铁路都连接着两个不同的城镇,且该铁路系统中不存在环。现需要确定一些列车运行线,使其满足: • 每条铁路最多属于一条列车运行线; • 每个城镇最多被一条列车运行线通过(通过包括作为起点或终点); • 每个城镇至少被一条列车运行线通过; • 列车运行线的数量应尽量小。