单纯最大流(两个给定节点的最小割)问题的最优解法

本文介绍了单纯最大流问题,强调了最大流只能处理有向边的情况。最大流等于两点间分离的最小割,且讨论了如何利用最大流求解最小割的边数问题。通过调整边的流量,可以在求最大流的同时找到最短边的数量,这种方法在实际问题中有广泛应用。
摘要由CSDN通过智能技术生成

运用了各种不明所以的优化

反正我们会板子就行啦

然后再说几点最大流的用处


因为反向边的问题,所以最大流只能处理有向边的问题


点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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值