网络流【最大流、上下界可行流、最小割、最小割树、费用流】Summary
知识点总结
Attention
要注意链式前向星的init()时因为取一条边的反向边的时候要^1
Problems
hdu5988 Coding Contest
Description
给出n个点和m条边,每个点有si个人,bi份食物,每条边一开始可以通过一个人,后来的人每通过一个就有pi的概率使整个系统崩溃,问崩溃的最小的概率是多少
Solution
求最小崩溃的概率可以转化成求最大不崩溃的概率,然后跑最小费用最大流 把每个点的人数看成需要流出的流量,食物看成需要流入的流量 然后对概率取个log,把乘法变成加法,最后再乘回去即可。 要注意SPFA中判断要加eps,否则精度会炸
Code
1 |
|
hdu3549 Flow Problem
Description
最大流模板
Code
1 |
|
hdu3657 Game
Description
给你一个n×m的矩阵,矩阵的值表示选择这个格子所能获得的得分,如果相邻的格子被选择(四联通)的话,就要减掉一个2 * (两个格子值'与'的结果)。题目会钦定K个点必须选。求最大能获得的得分
Solution
这道题建图的方法比较巧妙。我们可以先假设全部的格子都选了,然后从中间去掉一些点使得去掉这些点的代价最小。于是就转化成了最小割问题。我们根据坐标奇偶性建图,跑一遍最小割即可。(具体建图方法见代码)
Code
1 |
|
hdu3987 Harry Potter and the Forbidden Forest
Description
求最小割中边数最小的一组割
Solution
先跑一边最大流,然后把满流的边(即可能成为答案的边)设为1,其他的边设为inf,再跑一边最大流即为答案
Code
1 |
|
hdu4940 Destroy Transportation system
Description
无源无汇上下界可行流模板
Code
1 |
|
hdu4862 Jump
Description
给定一个n*m的矩形(n,m≤10),每个矩形中有一个0~9的数字。 一共可以进行k次游戏,每次游戏可以任意选取一个没有经过的格子为起点,并且跳任意多步,每步可以向右方和下方跳。每次跳需要消耗两点间的曼哈顿距离减一的能量,若每次跳的起点和终点的数字相同,可以获得该数字的能量。(能量可以为负) 询问k次或更少次游戏后是否可以经过所有的格子,若可以求出最大的剩余能量。
Solution
建图的时候把每个点拆成两部分, 从S向左半部分连cap为1,cost为0的边,从右边部分向T连cap为1,cost为0的边 然后向每个可以到达的点连一条cap为1,cost为题目中所说的值的边,不过要建负的,最后再取相反数(因为是要使能量最大) 然后还要再新建一个点,由S向这个点连一条cap为K,cost为0的边,这样保证在K步之内有解 然后跑一遍最大流,如果最大流==N×M,则输出最小费用。否则输出-1
Code
1 |
|