BZOJ1797: [Ahoi2009]Mincut 最小割(洛谷P4126)

本文介绍了最小割问题,通过BZOJ1797和洛谷P4126题目为例,阐述了如何利用Tarjan算法求解最小割。在最小割中,满流边与最小割的关系被详细解释,同时提供了证明思路。最后,文中提到了在统计答案时需要注意的细节,并附上了相关代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最小割 Tarjan

BZOJ题目传送门
洛谷题目传送门

结论题。。。

跑一遍最小割,对残量网络进行缩点,使得剩下的边都是满流边。
一条边属于最小割的并集当这条边两个端点所在的联通块不同。
一条边属于最小割的交集当这条边两个端点所在的联通块分别与源点和汇点相同。

下面给出口胡:

如果这条边的两个端点在同一个联通块内,那么它就不是满流边,一定没有割它流入的满流边划算,也就不是最小割。
一条边如果一个点属于源点所在的联通块,它可以和一个点属于汇点所在的联通块这样的边互相代替。

①将每个SCC缩成一个点,得到的新图就只含有满流边了。那么新图的任一s-t割都对应原图的某个最小割,从中任取一个把id[u]和id[v]割开的割即可证明。

② 假设将(u,v)的边权增大,那么残余网络中会出现s->u->v->t的通路,从而能继续增广,于是最大流流量(也就是最小割容量)会增大。这即说明(u,v)是最小割集中必须出现的边。

​ —hzwer

最后统计答案的时候后向弧不能算。

代码:

#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 4005
#define M 60005
#define F inline
using namespace std;
struct edge{
   
    int nxt,to,v,x,f; }ed[M<<1];
int n,m,k=1,ti,s,t,tp,p,h[N],tmp[N],f[N],d[N],q[N];
int stk[N],dfn[N],low[N],num[N];
F char readc(){
   
   
	static char buf[100000],*l=buf,*r=buf;
	if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);
	return l==r?EOF:*l++;
}
F int _read(){
   
   
	int x=0; char ch=readc()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值