题目
原题链接
给定一个网络流,判断每条边可否是最小割以及是否一定是最小割。
分析
大概是个结论题吧
首先跑最大流,然后在残余网络上面进行操作。
如果u->v满流并且还有一条增广路,那么这条边就是删掉了也不会影响最大流,如果没有增广路,那么这条边才可以是最小割里面的边。
跑SCC
如果u->v之间有流并且两者不在同一强连通分量,则这条边可以是最小割。
如果u,v有流并且和源点、汇点同一集合,那么就说明这条边一定是最小割。
大概考虑几种情况来很极为不严谨的说明一下吧:
1.若满流,则v->u(反向边)被选择,一旦有增广路,那么就形成强连通分量。
2.如果该边不满流,则边和反向边都被选择,两者就属于一个强连通分量了。
3.若没有流,则肯定不是不是最小割,但是又不属于同一个强连通分量,因此需要特殊考虑。
(如果在最大流中没有满流,那么肯定不是割边啊,因此都要排除)
那么来看看一定是割边的情况:
若增加u->v流量上限,则会出现增广路,则已经可以说明一定是最小割集。
对比与理解
一条边流量减少则最大流减少,则这条边可能是最小割。(说明它可以限制最大流,但是不保证还有其它边限制最大流。)
一条边流量增加则最大流增加,则这条边一定是最小割。(说明已经没有边可以限制它了,所以它一定是割边。)
但是为什么通过我们上文提到的强连通分量关系就可以得到总流量减少了还是增大了,还要看上文那个不严谨的证明。
代码
注意利用边在邻接表中的位置关系快速查找。
#include<cmath>
#include<queue>
#include<cctype>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>