网络流模版(ISAP)/最大流最小割定理 poj 3469

这题单独列出来主要是记录最大流最小割算法的模版 ISAP

算法原理:http://www.renfei.org/blog/isap.html,算法模版来自王尼玛(航神orz)

题意:给你n个程序,可以在A上运行,可以在B上运行,花费都是不同的,另外给m个信息就是如果a和b在不同的CPU上运行,那么就要额外的花费,问所有程序都运行的最小花费


题解:说实话我看不出这题是网络流

百度之后知道是最小割,但是都讲不清

割是两个集合之间 边的流量之和

论文http://wenku.baidu.com/link?url=18wGjNTpOliA3q_ELBo3Bf52pTdjbnzXF3N3haZO5IfgzlM5CEMjqYwzPec65L8NZA_hRK6qz0bmMPwSgAL3TLP9aeLHc996yvScIZrpj3G

看了开头一些,虽然基本看不懂,但是对割的认识加深了

只能记住如果一些东西要划分成两种,那么就要用最小割定理

如果某个程序在A上运行,那么就连接一条边到源点s,如果在B上运行,那么就连接一条边到汇点t

如果a,b两个程序在不同的CPU上运行有额外花费,就把连a->b,b->a这么两条边

然后求从s到t的最大流,想想也是啊,如果从s->a->b,如果增广路经过走了a->b,b不可能回流到s,所以a,b此时必定是不同CPU,从b流向t,就要额外花费


计算最大流之后的残余网络,肯定有一部分点在s这边,一部分点在t这边,这些点就是分别用t和s运行的程序,然后两部分隔开了,两部分中间相连的流量为0的边的容量就是最小割,这些流量为0的边包括连接s,或者t,或者a,b之间的边,他们将源点汇点分开,所以就是最小割也就是等于最大流,也就是最小花费

因为如果a属于s集合,说明他到s的边还有流量,但是他到t的边和与其他在t那边的点的边上都没流量了,所以他是用t运行的,然后其他程序是用s运行的

他们交了额外花费,但是s->a的边还没满流,说明a在t这边运行是正确的

ps.以上只是我自己的理解,也许有错,也许说的不好,毕竟这个模型比较抽象,还需要时间消化


先来个ISAP的模版

http://paste.ubuntu.net/12637252/


/**************************************最小费用最大流模版 spfa算法******************************************************************************************/

今天真是哔了猴了,一个模版题做了一下午,还以为是模版错了,结果居然是建图的时候超级源点和超级汇点我为了偷懒一起放在两重循环里,导致连接汇点的边建了好多次,坑了我半天啊,算了,好歹我很熟悉了这个算法

模版题 poj 2195

题意不说了,直接贴模版了,用的是大白上面的spfa做的

http://paste.ubuntu.net/12637263/

再刷两个水题测测模版,解解火气

poj 2516

题意:给你n个收购商,m个货源,k种东西,不同的东西从不同的货源到不同的收购商手里的单位价格不同,求最小费用

题解:最小费用最大流,然后有k个东西,不好建图,看着数据比较小,就k个物品分开建图跑费用流

AC代码 : http://paste.ubuntu.net/12638080/




你可能感兴趣的:(ACM)