运用了各种不明所以的优化
反正我们会板子就行啦
然后再说几点最大流的用处
因为反向边的问题,所以最大流只能处理有向边的问题
点i和点j的最大流其实是等于把点i和点j分开的最小割的
你想啊,从i到j有那么多流量对吧
如果我想要让i一滴水都留不到j
那么我至少要割掉最大流那么多的流量吧,具体证明。。。。我忘了,反正我等弱鸡队伍用个板子就行
还有一个用处是在忘了那一场的网络赛上看到的
就是求两个点的最小割的最小要割的边的边数
那么假设有1000个点,我把每条边的流量=原本的流量×1000+1
最后把得到的流量%1000就是最小的边数了
这个很是有用啊感觉
那么在求最大流的同时也把最短的边数找出来了,真的是非常神奇
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
const int MAXN = 1010;//点数的最大值
const int MAXM = 400010;//边数的最大值
const int INF = 0x3f3f3f3f;
struct Edge
{
int to, next, cap, flow;
}edge[MAXM];//注意是MAXM
int tol;
int head[MAXN];
int gap[MAXN], dep[MAXN], pre[MAXN], cur[MAXN];
void init()
{
tol = 0;
memset(he