图论算法与模型
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图论算法与模型
刘汝佳
SSSP
给加权图和一个起点s, 求s到所有点的最短路 (边权和最小的路径) 最短路有环吗
– 正环: 何必呢, 删除环则得到更短路 : , – 负环: 无最短路, 因为可以沿负环兜圈子
最优性原理
最优性原理: 若最短路u v经过中间结点w, 则 u w和w v的路径分别是u到w和w到v的最短路. 意义: 贪心、动态规划
解决方案:把结点放到bag中,每次取一个出来检查 特殊bag:dijkstra(heap), bellman-ford(queue)
SSSP:bellman-ford算法
Ford 1956, Bellman 1958, Moore 1959. 如有最短路,则每个顶点最多经过一次
– – – – – – – – 这条路不超过n-1条边 长度为k的路由长度为k-1的路增加一条边得到 由最优性原理, 只考虑长度为1…k-1的最短路 算法梗概: 每次迭代依次松弛每条边 O(Dm),v为迭代次数(v<=n-1) 完全图边权在[0, 1]中均匀分布, 很大概率D=O(log2n) 若某次迭代没进行成功松弛, 可立即停止 可用dijkstra得到初始dist
1 3 40
分层图
Vi拆成Vi,0, …, Vi,m,表示已经用了多少次设 备, 则一条边变为(m+1)(m+2)<=132条边, 一共不超过2*105条边.
Numbering Paths
给出有向图邻接矩阵,求每两点间 每两点间不同路 每两点间 径的个数num[i,j] 如果有无限多, 则设num[i,j] = -1
算法何时能结束呢?
– 含负圈(能到达的),则永不结束,因为在一 次松弛以后,负圈上一定有紧边(反证) – 不含负圈,则一定结束,因为要么减少一个无 穷dist值,要么让所有有限dist值之和至少减少 一个“不太小的正值”。
一般SSSP算法
一般算法
– 可以以任意顺序寻找紧边并松弛 – 收敛时间没有保障
分析
可以按照原始的方法, 用二元组(c, v)表示, 即当前 的路口和速度. 但n*v=7.5*104, 很难直接用dijkstra 求解. 直接用优先队列
– 对于点c, 记录当前最大速度v, 如果新速度v’小于它, 不 进队列; 否则修改v到v’ – 本来就有限速标志的边, 到达它的速度没有意义
当sum固定时, 此不等式组是差分约束系统 可以枚举sum, 也可以二分
网络提速
给定含有n个顶点的带权无向图,一共可以 进行m次操作,每次操作将一条边的权值除 以2。问每次应该对哪些边进行操作,使得 1到n的最短路径权和最小。 n<=50, m<=10
增量?
先求出使用前m-1台加速设备的最短路长, 然后通过枚举之类算出第m台设备用在那条 边上,行不行呢? 2 16 8 m=1: 16 8 m=2: 40 10 1 4
分析
结点(u, v)表示到达城市u, 当前总花费为v. 边权为时间, 则问题转化为从(1, 0)出发的单 源最短路. 由于0<=v<=1002, 因此每个点被 拆为10000个, 边数为3*106.
Layout (USACO Dec 2005)
有N(2<=N<=1000)头奶牛按顺序沿一条直线站着 等候喂食。因为奶牛相当苗条,所以可能有两头 或者更多奶牛站在同一位置上。一些奶牛相互间 存有好感,它们希望两者之间的距离不超过一个 给定的数L。另一方面,一些奶牛相互间非常反感, 它们希望两者间的距离不小于一个给定的数D。 给出ML条关于两头奶牛间有好感的描述,再给出 MD条关于两头奶牛间存有反感的描述。 (1<=ML,MD<=104,1<=L,D<=106). 在满足所有 要求的情况下,要求1号奶牛和N号奶牛间的距离 尽可能大(可能是无穷大)
24小时营业的超市需要一批出纳员. 给出每 小时需要出纳员的最少数R0, …, R23
– R(0): 午夜到1:00需要出纳员的最少数目, – R(1)表示上午1:00到2:00之间需要的… – 每一天,这些数据都是相同的
N人申请这项工作, 若第i个申请者被录用, 他将从ti刻开始连续工作8小时. 计算为满足 上述限制需要雇佣的最少出纳员数目. i时 刻可以有比对应的Ri更多的出纳员在工作
分析
将N种货币看成N个结点,将每个兑换点转 化为两条有向边。根据兑换公式,目前从A 货币兑换到B货币的汇率和中转费用为RAB, CAB,那么由对应的A结点向B结点连一条有 向边,从A点得到的B的可能最大值为:(A 目前的最大值-CAB)×RAB 注意,这里所求的是最大值,为了转化为最 短路,我们可以在数字前面加上一个负号
一般SSSP算法
临时最短路
– 存在此路,即真实的最短路长度不大于此路长度 – 但是有可能有更短的,所以此路长度只是一个上界
给定起点s,对于每个顶点v,定义
– – – – dist(v)为临时最短路树中s->v的长度 pred(v)为临时最短路树中s->v中v的前驱 初始化: dist(s)=0, pred(s)=NULL, 初始化: 所有其他dist(v)为无穷,pred(v)=NULL
时间复杂度
APSP基本想法
考虑从每个点出发做一次SSSP的时间效率 权任意时n次bellman-ford是O(n2m), 稠密图 时O(n4) 思路: 动态规划
状态设计
设d[i,j,k]是在只允许经过结点1…k的情况下i 到j的最短路长度, 则它有两种情况:
– 最短路经过点k,d[i,j,k]=d[i,k,k-1]+d[k,j,k-1] – 最短路不经过点k,d[i,j,k]=d[i,j,k-1]
结论
– 存在紧的边,一定没有正确的求出最短路树 – 不存在紧的边,一定正确的求出最短路树
一般SSSP算法的正确性
(u,v)被称为紧的:dist(u)+w(u,v)<dist(v) 不存在紧边,一定求出最短路树
– 即由pred表示出的路径上所有边权和等于dist(v) (归纳于松弛的次数) – 结束时对s到v的任意路s v,dist(v)<=w(s v)
归纳于s v所含边数,假设s u-v(u=pred(v)) dist(u)<=w(s u),两边加w(u,v)得: dist(u)+w(u,v)<=w(s v)。因为无紧边,所以 dist(v)<=dist(u)+w(u,v)<=w(s v)
一般SSSP算法的结束条件
刚才已经证明
– 结束时dist(v)和pred(v)相容 – 若算法结束,则结果正确
最小最大边问题
有n座城市,p条双向道路把这些城市连接 起来,一对城市之间可能有多条道路连接。 FJ要找到k条从城市1到城市n的路径,不同 的路径不能包含相同的道路。在这一前提 条件下,FJ希望所有路径中经过的最长的道 路最短。
Arbitrage
套汇: 不停的换外汇, 换回来后赚钱(假设无 手续费) 如三次兑换: 1*0.7*9.5*0.16=1.064>1 给出任意两种货币兑换的比率, 寻找一个方 案(必须换回来), 使得比率大于1.01 如果有多种方案, 求长度最短 长度最短的 长度最短
分析
本题可以抽象为: 给出正权完全有向图, 找 权乘积大于1.01的最短回路 类似Bellman-ford算法: 第k次迭代求出源点 到所有点不超过k条边的最长路, 设为di[j], 则若di[j] * weight[j, i] > 1.01, 立即输出.
BIC
城市的道路是双向的,每条道路有固定时 间及需要的费用。固定起点和终点,如果 路径A比路径B所需时间少且费用低,那么 我们说路径A比路径B好。对于某条路径, 如果没有其他路径比它好,那么该路径被 称为最优路径。 给出城市交通网的描述信息、起始点和终 点城市,求最优路径的条数。城市不超过 100个,边数不超过300个,每条边上的费 用和时间都不超过100。
更好的方法是计算出从每个点i出发不经过任何限 速标志能到达的每个点及最短距离, 然后直接用 dijkstra, 和v无关
货币兑换
城市中流通着N(N<=100)类货币,用数字1 至N标号表示。每个货币兑换点用6个数字 来描述:整数A和B是兑换货币的编号,实 数RAB,CAB,RBA,CBA分别是A兑换成B和 B兑换成A的汇率和中转费用。Nick有一些 第S类货币,他想在若干次交换后增加他的 资金,当然这些资金最终仍是第S类货币。 请你告诉他该想法能否实现。
最短路的表示
最短路的表示
– – – – s到所有点的最短路不需要分别表示 最短路树: 到每个点都沿着树上的唯一路径走 实际代码: 记录每个点的父亲pred[u]即可 输出最短路: 从终点沿着pred[u]递推回起点
为什么单源最短路形成树?
考虑下图 如果u z的路只取一条即可
最短路树和最小生成树
速度限制
在这个繁忙的社会中,我们往往不再去选 择最短的道路,而是选择最快的路线。开 车时每条道路的限速成为最关键的问题。 不幸的是,有一些限速的标志丢失了,因 此你无法得知应该开多快。一种可以辩解 的解决方案是,按照原来的速度行驶。 你的任务是计算两地间的最快路线。
速度限制
地图包括N(<=150)个路口和M条单向道路。 每条道路最多只有一块速度为 V(0<=V<=500)的限速标志,位于路的起点。 V=0代表标志丢失. 两个路口最多只有一条 路直接相连。 加速能够在瞬间完成并且不会有交通堵塞 等情况会影响你。开始时你位于0点,并且 速度为70。
Floyd-Warshall算法
把k放外层循环,可以节省内存 注意”无穷大”的运算 时间复杂度: O(n3) 空间复杂度: O(n2)
路的最小公倍数
给出一个带权无向图G
– 边权为1…1 000的整数 – 对于v0到v1的任意一条简单路p, 定义s(p)为p上 所有边权的最大公约数 – 考虑v0到v1的所有路p1,p2,…, 求所有 s(p1),s(p2),…的最小公倍数
分析
不等式模型
0 vi vi+1 k -k
– 顺序约束: d[i]<=d[i+1] – 好感描述(i,j,k) (i<=j): d[j]-d[i]<=k – 反感描述(I,j,k) (i<=j): d[j]-d[i]>=k – 统一形式: d[i]<=d[j]+k
vi vi
vj vj
对比: d(v)<=d(u)+w(u,v) 设d[1]=0, 则d[n]为1和n的最大距离
dist(v)称为点v的标号(label), 它是最短路的上界 基本想法: 让标号不断趋近, 最终达到最短路
一般SSSP算法
什么样的标号明显可以改进(趋近最短路)?
– 一条边(u,v)被称为紧的(tense), 如果 dist(u)+w(u,v)<dist(v) – 可以松弛:dist(v)=dist(u)+w(u,v), pred(v)=u
分析
前i小时的雇佣总数:s[i] (规定s[-1] = 0) 第i小时需要的出纳员:r[i] 第i小时申请的人数:t[i] 取(i,j)满足i = (j+8) mod 24, 则有不等式
– – – – 0 <= s[i] – s[i-1] <= t[i] s[23] – s[-1] = sum i > j时 s[i] – s[j] >= r[i] I < j时 s[i] – s[j] >= r[i] – sum
Interval
构造一个有序的正整数序列,满足若干信 息(ai,bi,ci),表示在该序列中处于闭区间[ai bi] 内的正整数至少有ci个。如果存在这样的序 列,要求序列的长度尽量小
不等式ຫໍສະໝຸດ Baidu型
Si表示1~i在序列中出现的总次数 (a,b,c) Sb-Sa-1>=c 差分约束系统
出纳员的雇佣
分析
类似floyd. 设d[i,j,k]为从i到j只经过结点1…k 的路径个数, 则 d[i,j,k]=d[i,j,k-1]+d[i,k,k-1]*d[k,j,k-1] sum[i,j] = d[i,j,n] 检查所有点k, 如果sum[k,k]>0, 则k在圈上; 如果某两点i,j满足sum[i,k]和sum[k,j]都大于 0, 则路径有无穷多条(即使i和j本身都不在圈 内).
刘汝佳
SSSP
给加权图和一个起点s, 求s到所有点的最短路 (边权和最小的路径) 最短路有环吗
– 正环: 何必呢, 删除环则得到更短路 : , – 负环: 无最短路, 因为可以沿负环兜圈子
最优性原理
最优性原理: 若最短路u v经过中间结点w, 则 u w和w v的路径分别是u到w和w到v的最短路. 意义: 贪心、动态规划
解决方案:把结点放到bag中,每次取一个出来检查 特殊bag:dijkstra(heap), bellman-ford(queue)
SSSP:bellman-ford算法
Ford 1956, Bellman 1958, Moore 1959. 如有最短路,则每个顶点最多经过一次
– – – – – – – – 这条路不超过n-1条边 长度为k的路由长度为k-1的路增加一条边得到 由最优性原理, 只考虑长度为1…k-1的最短路 算法梗概: 每次迭代依次松弛每条边 O(Dm),v为迭代次数(v<=n-1) 完全图边权在[0, 1]中均匀分布, 很大概率D=O(log2n) 若某次迭代没进行成功松弛, 可立即停止 可用dijkstra得到初始dist
1 3 40
分层图
Vi拆成Vi,0, …, Vi,m,表示已经用了多少次设 备, 则一条边变为(m+1)(m+2)<=132条边, 一共不超过2*105条边.
Numbering Paths
给出有向图邻接矩阵,求每两点间 每两点间不同路 每两点间 径的个数num[i,j] 如果有无限多, 则设num[i,j] = -1
算法何时能结束呢?
– 含负圈(能到达的),则永不结束,因为在一 次松弛以后,负圈上一定有紧边(反证) – 不含负圈,则一定结束,因为要么减少一个无 穷dist值,要么让所有有限dist值之和至少减少 一个“不太小的正值”。
一般SSSP算法
一般算法
– 可以以任意顺序寻找紧边并松弛 – 收敛时间没有保障
分析
可以按照原始的方法, 用二元组(c, v)表示, 即当前 的路口和速度. 但n*v=7.5*104, 很难直接用dijkstra 求解. 直接用优先队列
– 对于点c, 记录当前最大速度v, 如果新速度v’小于它, 不 进队列; 否则修改v到v’ – 本来就有限速标志的边, 到达它的速度没有意义
当sum固定时, 此不等式组是差分约束系统 可以枚举sum, 也可以二分
网络提速
给定含有n个顶点的带权无向图,一共可以 进行m次操作,每次操作将一条边的权值除 以2。问每次应该对哪些边进行操作,使得 1到n的最短路径权和最小。 n<=50, m<=10
增量?
先求出使用前m-1台加速设备的最短路长, 然后通过枚举之类算出第m台设备用在那条 边上,行不行呢? 2 16 8 m=1: 16 8 m=2: 40 10 1 4
分析
结点(u, v)表示到达城市u, 当前总花费为v. 边权为时间, 则问题转化为从(1, 0)出发的单 源最短路. 由于0<=v<=1002, 因此每个点被 拆为10000个, 边数为3*106.
Layout (USACO Dec 2005)
有N(2<=N<=1000)头奶牛按顺序沿一条直线站着 等候喂食。因为奶牛相当苗条,所以可能有两头 或者更多奶牛站在同一位置上。一些奶牛相互间 存有好感,它们希望两者之间的距离不超过一个 给定的数L。另一方面,一些奶牛相互间非常反感, 它们希望两者间的距离不小于一个给定的数D。 给出ML条关于两头奶牛间有好感的描述,再给出 MD条关于两头奶牛间存有反感的描述。 (1<=ML,MD<=104,1<=L,D<=106). 在满足所有 要求的情况下,要求1号奶牛和N号奶牛间的距离 尽可能大(可能是无穷大)
24小时营业的超市需要一批出纳员. 给出每 小时需要出纳员的最少数R0, …, R23
– R(0): 午夜到1:00需要出纳员的最少数目, – R(1)表示上午1:00到2:00之间需要的… – 每一天,这些数据都是相同的
N人申请这项工作, 若第i个申请者被录用, 他将从ti刻开始连续工作8小时. 计算为满足 上述限制需要雇佣的最少出纳员数目. i时 刻可以有比对应的Ri更多的出纳员在工作
分析
将N种货币看成N个结点,将每个兑换点转 化为两条有向边。根据兑换公式,目前从A 货币兑换到B货币的汇率和中转费用为RAB, CAB,那么由对应的A结点向B结点连一条有 向边,从A点得到的B的可能最大值为:(A 目前的最大值-CAB)×RAB 注意,这里所求的是最大值,为了转化为最 短路,我们可以在数字前面加上一个负号
一般SSSP算法
临时最短路
– 存在此路,即真实的最短路长度不大于此路长度 – 但是有可能有更短的,所以此路长度只是一个上界
给定起点s,对于每个顶点v,定义
– – – – dist(v)为临时最短路树中s->v的长度 pred(v)为临时最短路树中s->v中v的前驱 初始化: dist(s)=0, pred(s)=NULL, 初始化: 所有其他dist(v)为无穷,pred(v)=NULL
时间复杂度
APSP基本想法
考虑从每个点出发做一次SSSP的时间效率 权任意时n次bellman-ford是O(n2m), 稠密图 时O(n4) 思路: 动态规划
状态设计
设d[i,j,k]是在只允许经过结点1…k的情况下i 到j的最短路长度, 则它有两种情况:
– 最短路经过点k,d[i,j,k]=d[i,k,k-1]+d[k,j,k-1] – 最短路不经过点k,d[i,j,k]=d[i,j,k-1]
结论
– 存在紧的边,一定没有正确的求出最短路树 – 不存在紧的边,一定正确的求出最短路树
一般SSSP算法的正确性
(u,v)被称为紧的:dist(u)+w(u,v)<dist(v) 不存在紧边,一定求出最短路树
– 即由pred表示出的路径上所有边权和等于dist(v) (归纳于松弛的次数) – 结束时对s到v的任意路s v,dist(v)<=w(s v)
归纳于s v所含边数,假设s u-v(u=pred(v)) dist(u)<=w(s u),两边加w(u,v)得: dist(u)+w(u,v)<=w(s v)。因为无紧边,所以 dist(v)<=dist(u)+w(u,v)<=w(s v)
一般SSSP算法的结束条件
刚才已经证明
– 结束时dist(v)和pred(v)相容 – 若算法结束,则结果正确
最小最大边问题
有n座城市,p条双向道路把这些城市连接 起来,一对城市之间可能有多条道路连接。 FJ要找到k条从城市1到城市n的路径,不同 的路径不能包含相同的道路。在这一前提 条件下,FJ希望所有路径中经过的最长的道 路最短。
Arbitrage
套汇: 不停的换外汇, 换回来后赚钱(假设无 手续费) 如三次兑换: 1*0.7*9.5*0.16=1.064>1 给出任意两种货币兑换的比率, 寻找一个方 案(必须换回来), 使得比率大于1.01 如果有多种方案, 求长度最短 长度最短的 长度最短
分析
本题可以抽象为: 给出正权完全有向图, 找 权乘积大于1.01的最短回路 类似Bellman-ford算法: 第k次迭代求出源点 到所有点不超过k条边的最长路, 设为di[j], 则若di[j] * weight[j, i] > 1.01, 立即输出.
BIC
城市的道路是双向的,每条道路有固定时 间及需要的费用。固定起点和终点,如果 路径A比路径B所需时间少且费用低,那么 我们说路径A比路径B好。对于某条路径, 如果没有其他路径比它好,那么该路径被 称为最优路径。 给出城市交通网的描述信息、起始点和终 点城市,求最优路径的条数。城市不超过 100个,边数不超过300个,每条边上的费 用和时间都不超过100。
更好的方法是计算出从每个点i出发不经过任何限 速标志能到达的每个点及最短距离, 然后直接用 dijkstra, 和v无关
货币兑换
城市中流通着N(N<=100)类货币,用数字1 至N标号表示。每个货币兑换点用6个数字 来描述:整数A和B是兑换货币的编号,实 数RAB,CAB,RBA,CBA分别是A兑换成B和 B兑换成A的汇率和中转费用。Nick有一些 第S类货币,他想在若干次交换后增加他的 资金,当然这些资金最终仍是第S类货币。 请你告诉他该想法能否实现。
最短路的表示
最短路的表示
– – – – s到所有点的最短路不需要分别表示 最短路树: 到每个点都沿着树上的唯一路径走 实际代码: 记录每个点的父亲pred[u]即可 输出最短路: 从终点沿着pred[u]递推回起点
为什么单源最短路形成树?
考虑下图 如果u z的路只取一条即可
最短路树和最小生成树
速度限制
在这个繁忙的社会中,我们往往不再去选 择最短的道路,而是选择最快的路线。开 车时每条道路的限速成为最关键的问题。 不幸的是,有一些限速的标志丢失了,因 此你无法得知应该开多快。一种可以辩解 的解决方案是,按照原来的速度行驶。 你的任务是计算两地间的最快路线。
速度限制
地图包括N(<=150)个路口和M条单向道路。 每条道路最多只有一块速度为 V(0<=V<=500)的限速标志,位于路的起点。 V=0代表标志丢失. 两个路口最多只有一条 路直接相连。 加速能够在瞬间完成并且不会有交通堵塞 等情况会影响你。开始时你位于0点,并且 速度为70。
Floyd-Warshall算法
把k放外层循环,可以节省内存 注意”无穷大”的运算 时间复杂度: O(n3) 空间复杂度: O(n2)
路的最小公倍数
给出一个带权无向图G
– 边权为1…1 000的整数 – 对于v0到v1的任意一条简单路p, 定义s(p)为p上 所有边权的最大公约数 – 考虑v0到v1的所有路p1,p2,…, 求所有 s(p1),s(p2),…的最小公倍数
分析
不等式模型
0 vi vi+1 k -k
– 顺序约束: d[i]<=d[i+1] – 好感描述(i,j,k) (i<=j): d[j]-d[i]<=k – 反感描述(I,j,k) (i<=j): d[j]-d[i]>=k – 统一形式: d[i]<=d[j]+k
vi vi
vj vj
对比: d(v)<=d(u)+w(u,v) 设d[1]=0, 则d[n]为1和n的最大距离
dist(v)称为点v的标号(label), 它是最短路的上界 基本想法: 让标号不断趋近, 最终达到最短路
一般SSSP算法
什么样的标号明显可以改进(趋近最短路)?
– 一条边(u,v)被称为紧的(tense), 如果 dist(u)+w(u,v)<dist(v) – 可以松弛:dist(v)=dist(u)+w(u,v), pred(v)=u
分析
前i小时的雇佣总数:s[i] (规定s[-1] = 0) 第i小时需要的出纳员:r[i] 第i小时申请的人数:t[i] 取(i,j)满足i = (j+8) mod 24, 则有不等式
– – – – 0 <= s[i] – s[i-1] <= t[i] s[23] – s[-1] = sum i > j时 s[i] – s[j] >= r[i] I < j时 s[i] – s[j] >= r[i] – sum
Interval
构造一个有序的正整数序列,满足若干信 息(ai,bi,ci),表示在该序列中处于闭区间[ai bi] 内的正整数至少有ci个。如果存在这样的序 列,要求序列的长度尽量小
不等式ຫໍສະໝຸດ Baidu型
Si表示1~i在序列中出现的总次数 (a,b,c) Sb-Sa-1>=c 差分约束系统
出纳员的雇佣
分析
类似floyd. 设d[i,j,k]为从i到j只经过结点1…k 的路径个数, 则 d[i,j,k]=d[i,j,k-1]+d[i,k,k-1]*d[k,j,k-1] sum[i,j] = d[i,j,n] 检查所有点k, 如果sum[k,k]>0, 则k在圈上; 如果某两点i,j满足sum[i,k]和sum[k,j]都大于 0, 则路径有无穷多条(即使i和j本身都不在圈 内).