学习总结8

来源:互联网 发布:恶意软件博物馆 编辑:程序博客网 时间:2024/05/22 07:50

2017-12-16 网络流+二分图学习

最大流

例题

UVALive 7264 Kejin Game或者hihocoder1252 Kejin Game

你现在在点一棵技能树(图),你想学会一个技能有三种方式:
1,学会它所有的父技能,然后花费ai的代价学会它。
2,花费bi的代价,可以不学某个父技能。
3,花费ci的代价,直接氪掉这个技能。
现在问你,最少花多少钱,能学到某个技能。
好题。看到这道题最先想到DP,但是这道题无法推出正确的状态转移。正解是网络流,要用到一种经典的建图套路将原题转化为最小割的求解问题。首先将每个点i拆为i1,i2两个点,对于第一种学习方式,从源点向点i1连一条容量为ai的边;对于第二种,从父节点向点i2连一条容量为bi的边;对于第三种,对于点i从i1向i2连一条容量为ci的边。最后从i2向汇点连边。

总结

最大流是考察频率较高的一个知识点,首先需要熟练掌握模板的写法,要保证能在短时间内一边写对。其次需要多加练习,了解各种建模的方法与套路,这样才能在面对最大流相关题目时胸有成竹。

费用流

例题

HDU6118 度度熊的交易计划

一个村庄可以看做是一共由n个片区,m条公路组成的地区。由于生产能力的区别,第i个片区能够花费a[i]元生产1个商品,但是最多生产b[i]个。同样的,由于每个片区的购买能力的区别,第i个片区也能够以c[i]的价格出售最多d[i]个物品。而每一个商品运输1公里,将会花费1元。求最大盈利。1<=n<=500,1<=m<=1000。
如果想到费用流,这道题就很好做了。建图是源点向每个点连一条容量bi,费用ai的边,每个点向汇点连一条容量为di,费用为ci的边。然后每个点向其他能到达的点连一条容量为inf,费用为公路长度的边。直接跑最小费用可行流即可。

hdu4494 Teamwork

有m种工人要完成n个任务,给定每个任务的开始时间,持续时间以及每个人物需要的每种类型的工人的数量。一个工人可以去做多个时间不重叠的任务,但他只能干符合自己类型的活。所有的任务必须人齐了才能干。问最少要多少个人能把活干完。数据组数<25,m<=5,n<=150
做出这道题首先要想到费用流,其次需要注意m种人相互之间是没有影响的,所以可以建m张图,对于每一种工人求出最小数量,那么总的最小人数就是所有种类最小人数的和。建图可以考虑经典的拆点思路,每个任务拆成两个点,一个用来自己用,一个用来往外提供。源点向自己用的点连容量为需要工人数量,费用为1的边。向往外提供的点连容量为需要工人数量,费用为0的边。每个自己用的点向汇点连容量为需要工人数量,费用为0的边,用来帮助跑满流。然后每个发散点往能去的地方连容量inf,费用0的边。跑费用流。

总结

费用流是我还不怎么熟悉的一个问题,现在只是大致了解费用流算法的原理,并没有真正去写过,所以还需要多花点时间,先熟悉模板,再掌握方法。

最大权闭合图

例题

hdu5855 Less Time, More profit

有M个商店,N个工厂,修建工厂i需要pay[i]金钱和t[i]时间,每个商店能获利pro[i]。每个商店获利的条件是建设了指定的k个工厂。求总获利不小于L的前提下,工厂建设的时间最大值最小是多少。数据组数<= 30,1 <= N, M <= 200。
不难发现所有被选择的工厂和商店构成了一个闭合子图,工厂的点权为-pay[i],商店的点权为pro[i]。于是我们已经能通过求最大权闭合图求出不限时间的最大收益了,但此题要求工厂建设的时间最大值最小,我们可以通过二分答案的方式,只考虑建造时间不超过当前答案的工厂,这样来跑最大权闭合图,就可以求出对最大时间有限制时的最大收益,判断此收益是否达到L即可得出当前答案是否合法。

Hihocoder 1398 网络流五·最大权闭合子图

举办班级建设活动。一共有N项活动,第i项活动能够产生a[i]的活跃值。班级一共有M名学生,邀请编号为i的同学来参加班级建设活动需要消耗b[i]的活跃值。每项活动都需要某些学生在场才能够进行,若其中有任意一个学生没有被邀请,这项活动就没有办法进行。班级建设的活跃值是活动产生的总活跃值减去邀请学生所花费的活跃值。最大化总活跃值。1≤N≤200,1≤M≤200。
就是求最大权闭合图。把活动和学生都看成点,活动的权值为活跃值,向所有需要的学生连边;学生的权值为所消耗活跃值的相反数。然后跑最大流就好了。很适合练习模板。

总结

如果一个问题,它有正点有负点,还要求最大值,八成就是最大权闭合图了。最大权闭合图可以转化为最大流来求解,所以首先还是要练熟最大流。另外,最大权闭合图本身的变化也比较多,需要多练,多思考才能精通。

二分图带权匹配

例题

Poj 2195 Going Home

给定一个N*M的地图,地图上有若干个人和房子,且人与房子的数量一致。需要为所有人指定一间房子,使得所有人的房子两两不同,且所有人移动距离的和最小。距离定义为曼哈顿距离。N,M<=100,人数<=100。
题意很明确,就是求解一个二分图带权匹配问题。每个人向每个房子连边,边权为人与房子的距离的相反数,然后直接跑二分图带权匹配,得到最大权值,再取相反数就是答案了。

UVaLive 6129 Sofa, So Good或Gym 100642H Sofa, So Good

工厂里生产沙发需要经过两个步骤,现在n个人生产n个沙发,每个人负责一个沙发的第一步骤和一个沙发(可以和前一个沙发不同)的第二步骤。每个沙发必须先经过第一步骤的加工再来到第二步骤。如果一个工人完成他所负责的第一个沙发,但是他所负责的第二个沙发还没有完成第一步骤,他就会去休息室玩耍直到第二个沙发完成了第一个步骤。现在需要合理分配每个工人的任务,使得第一步完成时间最短,在此基础上第二步完成时间最短,再其次需要所有工人娱乐的时间最短。输出每个工人第一步和第二步负责的沙发,以及每个工人完成任务的时间,以及所有工人娱乐时间的总和。
此题题意比较难理解,而且读懂题过后也难以入手,对做题者技巧的考验较高。对于两步工序,由于我们首先是要使第一步用时最小,所以第一步直接跑二分图带权匹配即可,对于第二步,我们需要综合考虑第一步的完成时间,那么和第一步类似,只需在所有边权上再附加一个对应工人开始第二步工作的时间即可。最小化第一、第二步时间后,总休息时间必定最小。

总结

二分图带权匹配的主要算法就是KM算法,要熟练掌握。另外和二分图最大匹配可以用最大流求解一样,二分图带权匹配问题也可以转换成费用流求解,这种做法也可以练一练。