图论.pptx

上传人:b****2 文档编号:2356407 上传时间:2022-10-29 格式:PPTX 页数:52 大小:316.22KB
下载 相关 举报
图论.pptx_第1页
第1页 / 共52页
图论.pptx_第2页
第2页 / 共52页
图论.pptx_第3页
第3页 / 共52页
图论.pptx_第4页
第4页 / 共52页
图论.pptx_第5页
第5页 / 共52页
点击查看更多>>
下载资源
资源描述

图论.pptx

《图论.pptx》由会员分享,可在线阅读,更多相关《图论.pptx(52页珍藏版)》请在冰豆网上搜索。

图论.pptx

图论与网络流选讲图论与网络流选讲cxjyxx_me目录最短路最小生成树最大流最小割费用流最短路带权图G=(V,E):

对于每条边eE都有一个权值w(e)。

满足下面两个条件的顶点序列(v1,v2,.,vk)称为从v1到vk的一条路径:

viV(1ik)。

(vi,vi+1)E(1ik)。

路径长度定义为:

Pk1i=1w(vi,vi+1)。

最短路是从起点S到终点T长度最短的路径最短路最短路算法分为单源最短路、多源最短路,分别可以用Dijkstra、Floyd等算法解决,相信大家都已经熟知,就不再赘述。

最短路问题的主要难点还是在于建图,所以接下来选择了一些例题进行讲解。

飞行飞行路线路线Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。

该航空公司一共在n个城市设有业务,一共有m种航线,每种航线连接两个城市,并且有一定的价格。

Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。

航空公司对他们这次旅行也推出优惠,他们可以免费搭乘k次飞机。

那么Alice和Bob这次出行最少花费多少?

2=n=10000,1=m=50000,0=k=10解题思路经典的分层图。

可以发现免费搭乘的次数k非常小,自然的想到使用拆点法进行建图。

把每个节点i拆成k+1个节点(i,j),0=j(v,j+1),费用为0,表示使用了一次免费飞行。

再跑从起点到终点的最短路即可。

TaxiinBerland给一个w*l的网格,格边长为1,开始在(x0,y0)点,目标是(x1,y1)点,刚开始是速度为0,你可以用一个加速度a进行加速和减速,但速度须满足0=V=Vmax。

在某些格点会设有额外的速度限制,起点和目标点一定不是限速点。

共n个点,速度限制都是Vp,问从起点到目标点的最短时间。

0=w,l,n=1000=Vp=Vmax=100解题思路最开始的想法:

之间把每个点抽象成图中的节点,四联通连边,跑最短路?

不能考虑到起始的速度。

把每个点按进入点的速度进行拆点,再跑最短路?

速度是小数,且可能有很多可能,建图点数太多。

另一个想法解题思路最优的路径肯定是不断加速直到上限,然后维持上限速度前进,直到要经过某个限速点前几秒开始减速,到限速点恰好达到上限。

有几个结论:

速度到达Vp前,一直在加速。

一旦速度到达Vp,就不可能再低于Vp一旦速度到达Vp,经过所有限速点的速度必恰好是Vp。

解题思路综合以上结论,可以这样建图:

首先起点起点对所有的限速点限速点连边,边权为从起点出发,不经过限速点的情况下,起始速度为0,到达限速点的最少时间。

限速点限速点间互相连边,边权为不经过限速点的情况下,起始速度为Vp,到达限速点的最少时间。

所有限速点限速点到目标点目标点连边,边权为不经过限速点的情况下,起始速度为Vp,到达目标点的最少时间。

起点起点到目标点目标点连边,边权为从起点出发,不经过限速点的情况下,起始速度为0,到达目标点的最少时间。

然后跑最短路即为解。

TheCaptain给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用。

2=n=200000解题思路首先考虑min的问题,其实直接不管他,x、y方向都建边就会自动min了。

然后考虑建边,如果暴力建边则需要建n2条边,显然不可接受。

解题思路可以分析一下边权的性质。

对于(x1,y1),(x2,y2),(x3,y3)这三个点,若x1=x2P3的边可以由(P1-P2)+(P2-P3)组成,所以P1-P3的边可以不用显式的建出来,而是由P1-P2和P2-P3的边构成。

建图如下:

把所有点按x排序,每个点向相邻点连权值为x差的绝对值的边。

再把所有点按y排序,同理。

再直接跑最短路即可。

Tax给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价。

起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权N=100000M=200000解题思路如果ni2,i1的边权为max(vj1,i1,vi1,i2)最后枚举i取min(distfinal,i+vi,final)作为答案解题思路但是这个方法点数是平方级别的,本题明显不足。

想法2:

把边变成点,点变成边,从一条边走向另一条边的代价是这两条边的权值的较大值。

点数变为O(n)级别,但是对于菊花图,边数仍是n2级别的。

v1v2max(v1,v2)解题思路想法3:

对想法2进行优化,利用边权差来节省边数。

具体的是对于连接某一个点的所有边按边权排序,每条边在新图对应的点向相邻的较大的边对应的点连一条权值为两条边的权值差的边,向相邻的较小的边连一条权值为0的边,并且把这条边对应的点拆成两个点,经过代价为这条边的权值。

这样就把max操作通过差分把边数优化成了O(m)级。

000v2-v1v3-v2v4-v3v2小结其实最短路算法在很多题目中只是一个辅助的作用,重要的是发现题目的一些性质,然后进行建图。

其实图论包括网络流都是重在建图,算法本身并不是难点,但是也不排除一些题目需要通过改算法过程来求解。

最小生成树最小生成树算法主要使用Prim算法,就是那个类似Dijkstra的算法,可以用堆优化成O(mlogn)的复杂度。

Kruskal算法,排序边再并查集,复杂度O(mlogm)。

与最短路相同,这也不再讲述算法的详细实现,直接看例题吧XD最小生成树计数最小生成树计数现在给出了一个简单无向加权图。

你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树。

(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的)。

数据保证不会出现自回边和重边。

注意:

具有相同权值的边不会超过10条。

由于不同的最小生成树可能很多,所以你只需要输出方案数对31011的模就可以了。

1=节点数n=100;1=边数m=1000;解题思路考虑Kruskal的过程,权值较大的边对权值较小的边的选取并没有影响,所以可以把边按权值分类,从小到大打依次加边。

考虑同一个权值的边集,枚举选取哪些边可以使不出现自环且连完后的联通集数与全部连边一样。

假设对于权值v有Kv种选边方案,则最后的生成树个数就是Kv。

次小生成树现在给出了一个简单无向加权图。

要求求出它的严格次小生成树。

n=105,m=3*105解题思路对于最小生成树,次小生成树必然是把某条边替换掉最小生成树的某条边。

对于一张图的最小生成树,每条非树边都可以对应一条树路径,如果在树中加入这条边,则必须删除这段树路径的任意一条边。

解题思路先考虑非严格次小生成树,先求出原图的最小生成树,再枚举每条非树边,用这条非树边代替它对应的树路径的最大权值边,(新树的权值和-原树的权值和)=(新边权值-树路径最大边权值)。

所以(新边权值-树路径最大边权值)最小的方案就是次小生成树的方案。

至于求树路径最大值,就用倍增法统计最大值即可。

然后对于严格次小生成树,只要在倍增数组中额外统计一个严格次大边权,如果最大边权=新边权值,则用严格次大边权代替最大边权即可。

MashmokhsDesignedProblem给一张无相连通图,每条边可能是黑边或白边,问是否存在一种生成树构造使得树上黑边数量=白边数量?

2=n=105,1=m=105解题思路首先有个定理,若一张图的边权只有0或1,则对任意处于最小生成树权值和到最大生成树权值和之间的权值,都存在权值对应的生成树的构造。

证明思路课参考次小生成树那题。

于是对于本题,只要把白边变为权值为0的边,黑边变为权值为1的边,求出最大生成树和最小生成树,判断(n-1)/2是否位于他们的权值和之间即可。

Kuglarz桌上有n个杯子,每个杯子里可能有一个小球或者没有小球,每次你可以询问第ij杯子的小球个数是奇数或偶数,需要花费Cij的代价,问猜出杯子下的小球分布最少需要花费多少代价。

n=2000,1=Cij=109解题思路询问ij的和的奇偶性就等价于询问sumj-sumi-1的奇偶性(sum为前缀和),而知道小球分布的充分必要条件是知道sum0sumn的奇偶性。

一次询问i,j相当于让你能够从sumi-1的奇偶性推出sumj的奇偶性,同样也能从sumj的奇偶性推出sumi-1的奇偶性。

如果把一次询问i,j当成一次连边(i-1)(j),则联通块中的点的奇偶性可以互相推出。

而开始时只有sum0的奇偶性我们是知道的,所以题目就转换为把n+1个点联通的的最小代价的问题,即最小生成树。

解题思路具体算法过程:

建立编号为0n的n+1个节点的图,对每个询问代价Cij,把i-1到j连一条权值为Cij的边,再对这张图求最小生成树即可。

网络流网络流的算法好像基本上就SAP、dinic,费用流的spfa,网络流的题目更是典型的算法一个字不用改,专门考建图。

考虑到大家的实力,这次就不讲网络流算法实现和网络流的各种概念了,看例题吧。

迷之奶牛有n只奶牛,m个挤奶点,每个挤奶点最多容纳k只奶牛,给出奶牛还挤奶点之间的距离,问每只奶牛都能进入一个挤奶点的情况下,奶牛们到挤奶点的距离的最大值最小是多少?

n+mmid的边删掉。

建图:

原点向每个奶牛连容量为1的边,每只奶牛向距离=mid,然后接着二分。

Pigs有M个猪圈,每个猪圈里初始时有若干头猪。

一开始所有猪圈都是关闭的。

依次来了N个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头猪。

每个顾客分别都有他能够买的数量的上限。

每个顾客走后,他打开的那些猪圈中的猪,都可以被任意地调换到其它开着的猪圈里,然后所有猪圈重新关上。

问总共最多能卖出多少头猪。

1=N=100,1=M=1000Pigs举个例子来说。

有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头。

解题思路先考虑最裸的建图解题思路上述建图方法的点数是平方级的,边数是三方级的,明显不能接受。

我们考虑开门这个操作,如果第i个人开了某些门Ai=,则相当于把这些门里的猪暂存到第i个人这里,如果在i之后的第j个人开了某些门Aj=,且AiAj,则第j个人可以直接从第i个人那里拿猪。

如果把猪作为流量,则是从i向j连了一条无穷容量的边。

解题思路建图如下:

每个人一个点。

对每个猪圈,若容量是ci,从原点到第一个打开猪圈的人连一条容量为ci的边,表示这个猪圈的猪都“寄存”到这个人那里。

对与任意两个人i、j,iT边都相等。

最小割对于一元关系,比如x取或不取有一些代价,就直接把b、d、f、e=0,直接使用a、c即可。

对于多元关系,接下来通过例题介绍。

DualCoreCPU有n个任务,两台机器。

任务i在第一台机器上执行的花费为Ai,在第二台机器上执行的花费为Bi。

有M个关系(ak,bk),如果ak,bk两个任务在不同机器上执行会产生额外的代价wk。

问,如何分配这n个任务使得总花费最少。

n20000,m200000解题思路根据上面的最小割模型,两台机器可以视作取或不取,每个任务作为一个点,取不取都有对应的代价,对于一对关系(ak,bk),相当于(ak取,bk不取)或(ak不取,bk取)的代价都是wk。

所以建图如下:

源点向每个任务连条容量为Ai的边每个任务向汇点连条容量为Bi的边第ak个点和第bk个点连条容量为wk的双向边最小割即为答案。

小小M的的作物作物给定n个元素,需要放在两个集合里,每个元素放在集合A里的贡献为ai,放在集合B里的贡献为bi其中还有m个子集若一个子集的所有元素都在A集合里会获得贡献值c1i,都放在B集合里会获得贡献值c2i1=n=1000,0m=1000解题思路关于多元关系,比如上面这题的某个集合Si=a1,a2,ak,建立一个点x,叫做集合S里的点都选了A。

对x有一个一元关系,取x表示确实都选了,代

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1