图论
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
•
•
最短路是从起点S到终点T长度最短的路径
最短路
•
最短路算法分为单源最短路、多源最短路,分别可以用 Dijkstra、Floyd等算法解决,相信大家都已经熟知,就不再 赘述。
最短路问题的主要难点还是在于建图,所以接下来选择了一 些例题进行讲解。
•
飞行路线
•
Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的 航空公司。该航空公司一共在n个城市设有业务,一共有m种 航线,每种航线连接两个城市,并且有一定的价格。
有几个结论:
速度到达Vp前,一直在加速。 一旦速度到达Vp,就不可能再低于Vp 一旦速度到达Vp,经过所有限速点的速度必恰好是Vp。
•
解题思路
•
综合以上结论,可以这样建图:
首先起点对所有的限速点连边,边权为从起点出发,不经过限速 点的情况下,起始速度为0,到达限速点的最少时间。 限速点间互相连边,边权为不经过限速点的情况下,起始速度为 Vp,到达限速点的最少时间。 所有限速点到目标点连边,边权为不经过限速点的情况下,起始 速度为Vp,到达目标点的最少时间。 起点到目标点连边,边权为从起点出发,不经过限速点的情况下, 起始速度为0,到达目标点的最少时间。
•
把每个节点i拆成k+1个节点(i, j),0<=j<=k,表示从起点到第 i个点,且恰使用了j次免费搭乘的最小花费。
对每层k按原图权值建边,对每条边(u,v,c)额外建边 (u,j)->(v,j+1),费用为0,表示使用了一次免费飞行。 再跑从起点到终点的最短路即可。
•
•
Taxi in Berland
于是对于本题,只要把白边变为权值为0的边,黑边变为权 值为1的边,求出最大生成树和最小生成树,判断(n-1)/2是 否位于他们的权值和之间即可。
Kuglarz
•
桌上有n个杯子,每个杯子里可能有一个小球或者没有小球, 每次你可以询问第i~j杯子的小球个数是奇数或偶数,需要花 费Cij的代价,问猜出杯子下的小球分布最少需要花费多少代 价。
•
给一个w*l的网格,格边长为1,开始在(x0,y0)点,目标是 (x1,y1)点,刚开始是速度为0,你可以用一个加速度a进行加 速和减速,但速度须满足0<=V<=Vmax。在某些格点会设有 额外的速度限制,起点和目标点一定不是限速点。共n个点, 速度限制都是Vp,问从起点到目标点的最短时间。
0<= w,l,n<=100 0<=Vp<=Vmax<=100
• •
解题思路
•
最开始的想法:
之间把每个点抽象成图中的节点,四联通连边,跑最短路?
不能考虑到起始的速度。
把每个点按进入点的速度进行拆点,再跑最短路?
速度是小数,且可能有很多可能,建图点数太多。
•
另一个想法
解题思路
•
最优的路径肯定是不断加速直到上限,然后维持上限速度前 进,直到要经过某个限速点前几秒开始减速,到限速点恰好 达到上限。
由于不同的最小生成树可能很多,所以你只需要输出方案数 对31011的模就可以了。 1<=节点数n<=100; 1<=边数m<=1000;
•
•
•
解题思路
•
考虑Kruskal的过程,权值较大的边对权值较小的边的选取 并没有影响,所以可以把边按权值分类,从小到大打依次加 边。
考虑同一个权值的边集,枚举选取哪些边可以使不出现自环 且连完后的联通集数与全部连边一样。 假设对于权值v有Kv种选边方案,则最后的生成树个数就是 πKv。
• •
解题思路
•
• •
但是这个方法点数是平方级别的,本题明显不足。
想法2: 把边变成点,点变成边,从一条边走向另一条边的代价是这 两条边的权值的较大值。
v1 v2
•
点数变为O(n)级别,但是对于菊花图, 边数仍是n^2级别的。
max(v1,v2)
解题思路
•
•
想法3:
对想法2进行优化,利用边权差来节省边数。具体的是对于连 接某一个点的所有边按边权排序,每条边在新图对应的点向 相邻的较大的边对应的点连一条权值为两条边的权值差的边, 向相邻的较小的边连一条权值为0的边,并且把这条边对应的 点拆成两个点,经过代价为这条边的权值。 这样就把max操作通过差分把边数优化成了O(m)级。
•
解题思路
•
先考虑非严格次小生成树,先求出原图的最小生成树,再枚 举每条非树边,用这条非树边代替它对应的树路径的最大权 值边,(新树的权值和-原树的权值和)=(新边权值-树路径最大 边权值)。 所以(新边权值-树路径最大边权值)最小的方案就是次小生成 树的方案。
至于求树路径最大值,就用倍增法统计最大值即可。 然后对于严格次小生成树,只要在倍增数组中额外统计一个 严格次大边权,如果最大边权=新边权值,则用严格次大边权 代替最大边权即可。
•
•
•
Pigs
•
•
举个例子来说。
有3个猪圈,初始时分别有3、 1和 10头猪。依次来了 3个顾 客,第一个打开1号和 2 号猪圈,最多买 2头;第二个打开 1 号和3 号猪圈,最多买3头;第三个打开 2号猪圈,最多买 6 头。 那么,最好的可能性之一就是第一个顾客从 1 号圈买 2 头, 然后把 1 号圈剩下的 1 头放到 2 号圈;第二个顾客从 3号圈 买 3头;第三个顾客从 2号圈买2头。总共卖出 2+3+2=7头。
n<=2000, 1<=Cij<=10^9
•
解题思路
•
询问i~j的和的奇偶性就等价于询问sum[j]-sum[i-1]的奇偶性 (sum为前缀和),而知道小球分布的充分必要条件是知道 sum[0]…sum[n]的奇偶性。
一次询问i,j相当于让你能够从sum[i-1]的奇偶性推出sum[j]的 奇偶性,同样也能从sum[j]的奇偶性推出sum[i-1]的奇偶性。 如果把一次询问i,j当成一次连边(i-1)<-->(j),则联通块中的点 的奇偶性可以互相推出。 而开始时只有sum[0]的奇偶性我们是知道的,所以题目就转 换为把n+1个点联通的的最小代价的问题,即最小生成树。
•
迷之奶牛
•
有n只奶牛,m个挤奶点,每个挤奶点最多容纳k只奶牛,给 出奶牛还挤奶点之间的距离,问每只奶牛都能进入一个挤奶 点的情况下,奶牛们到挤奶点的距离的最大值最小是多少?
n+m<=300
•
解题思路
•
网络流并不好处理“最大值最小”这类问题,所以可以先二 分答案,再用网络流判断可行性,这也是个常用的做法。 首先二分答案mid,然后把所有权值>mid的边删掉。
•
解题思路
•
先考虑最裸的建图
解题思路
•
上述建图方法的点数是平方级的,边数是三方级的,明显不 能接受。
我们考虑开门这个操作,如果第i个人开了某些门Ai={…},则 相当于把这些门里的猪暂存到第i个人这里,如果在i之后的第 j个人开了某些门Aj={…},且Ai∩Aj≠∅,则第j个人可以直接从 第i个人那里拿猪。如果把猪作为流量,则是从i向j连了一条 无穷容量的边。
建图:原点向每个奶牛连容量为1的边,每只奶牛向距离 <=mid的奶站连容量为1的边,每个奶站向汇点连容量为m的 边。 跑最大流,若最大流=奶牛数则说明答案>=mid,然后接着二 分。
• •
•
Pigs
•
有 M 个猪圈,每个猪圈里初始时有若干头猪。一开始所有猪 圈都是关闭的。
依次来了 N 个顾客,每个顾客分别会打开指定的几个猪圈, 从中买若干头猪。每个顾客分别都有他能够买的数量的上限。 每个顾客走后,他打开的那些猪圈中的猪,都可以被任意地 调换到其它开着的猪圈里,然后所有猪圈重新关上。问总共 最多能卖出多少头猪。 1 <= N <= 100, 1 <= M <= 1000
图论与网络流选讲
——cxjyxx_me
目录
• 最短路
• 最小生成树 • 最大流 • 最小割 • 费用流
最短路
•
•
带权图G = (V,E):对于每条边e ∈ E都有一个权值w(e)。
满足下面两个条件的顶点序列(v1,v2,...,vk)称为 从v1到vk的 一条路径: vi ∈ V (1 ≤ i ≤ k)。 (vi,vi+1) ∈ E(1 ≤ i < k)。 路径长度定义为:Pk−1 i=1 w(vi,vi+1)。
v2-v1 0 v2 v3-v2 0 v4-v3 0
•
Biblioteka Baidu结
•
其实最短路算法在很多题目中只是一个辅助的作用,重要的 是发现题目的一些性质,然后进行建图。
其实图论包括网络流都是重在建图,算法本身并不是难点, 但是也不排除一些题目需要通过改算法过程来求解。
•
最小生成树
•
最小生成树算法主要使用 Prim算法,就是那个类似Dijkstra的算法,可以用堆优化 成O(mlogn)的复杂度。 Kruskal算法,排序边再并查集,复杂度O(mlogm)。
• •
•
Mashmokh’s Designed Problem
•
给一张无相连通图,每条边可能是黑边或白边,问是否存在 一种生成树构造使得树上黑边数量=白边数量? 2<=n<=10^5, 1<=m<= 10^5
•
解题思路
首先有个定理,若一张图的边权只有0或1,则对任意处于 最小生成树权值和到最大生成树权值和之间的权值,都存在 权值对应的生成树的构造。 证明思路课参考次小生成树那题。
Alice和Bob现在要从一个城市沿着航线到达另一个城市,途 中可以进行转机。航空公司对他们这次旅行也推出优惠,他 们可以免费搭乘k次飞机。那么Alice和Bob这次出行最少花费 多少?
•
•
2<=n<=10000,1<=m<=50000,0<=k<=10
解题思路
•
•
经典的分层图。
可以发现免费搭乘的次数k非常小,自然的想到使用拆点法进 行建图。
• • •
解题思路
•
•
具体算法过程:
建立编号为0~n的n+1个节点的图,对每个询问代价Cij,把 i-1到j连一条权值为Cij的边,再对这张图求最小生成树即可。
网络流
•
网络流的算法好像基本上就SAP、dinic,费用流的spfa,网 络流的题目更是典型的算法一个字不用改,专门考建图。
考虑到大家的实力,这次就不讲网络流算法实现和网络流的 各种概念了,看例题吧。
然后考虑建边,如果暴力建边则需要建n^2条边,显然不可接 受。
•
解题思路
•
•
可以分析一下边权的性质。
对于(x1,y1),(x2,y2),(x3,y3)这三个点,若x1<=x2<=x3, 则从x方向由P1->P3的边可以由(P1->P2)+(P2->P3)组成, 所以P1->P3的边可以不用显式的建出来,而是由P1->P2和 P2->P3 的边构成。 建图如下: 把所有点按x排序,每个点向相邻点连权值为x差的绝对值的 边。再把所有点按y排序,同理。 再直接跑最短路即可。
•
然后跑最短路即为解。
The Captain
•
给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为 min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。 2<=n<=200000
•
解题思路
•
首先考虑min的问题,其实直接不管他,x、y方向都建边就 会自动min了。
•
•
次小生成树
•
现在给出了一个简单无向加权图。要求求出它的严格次小生 成树。
n<=10^5, m<=3 * 10^5
•
解题思路
•
对于最小生成树,次小生成树必然是把某条边替换掉最小生 成树的某条边。
对于一张图的最小生成树,每条非树边都可以对应一条树路 径,如果在树中加入这条边,则必须删除这段树路径的任意 一条边。
与最短路相同,这也不再讲述算法的详细实现,直接看例题 吧XD
•
最小生成树计数
•
现在给出了一个简单无向加权图。你不满足于求出这个图的 最小生成树,而希望知道这个图中有多少个不同的最小生成 树。(如果两颗最小生成树中至少有一条边不同,则这两个 最小生成树就是不同的)。 数据保证不会出现自回边和重边。注意:具有相同权值的边 不会超过10条。
• •
•
Tax
• 给出一个N个点M条边的无向图,经过一个点的代价
是进入和离开这个点的两条边的边权的较大值,求从 起点1到点N的最小代价。起点的代价是离开起点的 边的边权,终点的代价是进入终点的边的边权
• N<=100000 • M<=200000
解题思路
•
•
如果n<=100
可以用分层图的思想,把每个点i拆成n个点,dist[i, j] 表示: 从起点出发,最终到达点i,且到达i的前一个点是j的最短距 离。(j的代价不算在内) [i1,j1]->[i2,i1]的边权为max(v[j1,i1], v[i1, i2]) 最后枚举i取min(dist[final, i] + v[i, final])作为答案