【BZOJ1797】[AHOI2009]最小割(网络流)
【BZOJ1797】[AHOI2009]最小割(网络流)
题面
BZOJ
洛谷
题解
最小割的判定问题,这里就当做记结论吧。(源自\(lun\)的课件)
我们先跑一遍最小割,求出残量网络。然后把所有还有流量的边拿出来跑\(Tarjan\)缩\(SCC\)。
如果一条满流边的两个端点不在同一个\(SCC\)中则这条边可能存在于最小割中。
证明:考虑如果减少一条边的容量之后,最小割变小了,证明这条边可能存在于最小割之中。
那么反过来,如果\((u,v)\)在同一个\(SCC\)中,我们把\(u\rightarrow v\)这条边的容量减小\(d\),那么我们把这个环上的所有边的容量都减少\(d\),仍然满足流量平衡,意味着最大流即最小割不变。反之最大流即最小割改变,那么这条边可能存在于最小割中。如果一条满流边\(u\rightarrow v\)的端点满足\(u\)和\(S\)在同一个\(SCC\),\(v\)和\(T\)在同一个\(SCC\),那么这条边必定在最小割中。
证明:增加一条边的容量,如果最小割增加,意味着这条边必定在最小割中。因为\(u\rightarrow\)是满流的边,所以沿反边\(u\)可达\(S\),\(T\)可达\(v\) 。如果\(S,u\)在同一个\(SCC\),\(T,v\)在同一个\(SCC\)中,说明\(S\)到\(u\)上还有增广路,\(v\)到\(T\)上还有增广路,那么\(u\rightarrow v\)的流量增加最小割也会增加,此时\(u\rightarrow v\)必定在最小割中。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define MAX 5000
#define MAXL 60060
#define inf 1000000000
inline int read()
{int x=0;bool t=false;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=true,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return t?-x:x;
}
struct Line{int v,next,w;}e[MAXL<<1];
int h[MAX],cnt=2;
inline void Add(int u,int v,int w)
{e[cnt]=(Line){v,h[u],w};h[u]=cnt++;e[cnt]=(Line){u,h[v],0};h[v]=cnt++;
}
int n,m,S,T,level[MAX],cur[MAX];
bool bfs()
{memset(level,0,sizeof(level));level[S]=1;queue<int> Q;Q.push(S);while(!Q.empty()){int u=Q.front();Q.pop();for(int i=h[u];i;i=e[i].next)if(e[i].w&&!level[e[i].v])level[e[i].v]=level[u]+1,Q.push(e[i].v);}return level[T];
}
int dfs(int u,int flow)
{if(u==T||!flow)return flow;int ret=0;for(int &i=cur[u];i;i=e[i].next){int v=e[i].v,d;if(e[i].w&&level[v]==level[u]+1){d=dfs(v,min(flow,e[i].w));ret+=d;flow-=d;e[i].w-=d;e[i^1].w+=d;if(!flow)break;}}if(!ret)level[u]=0;return ret;
}
int Dinic()
{int ret=0;while(bfs()){memcpy(cur,h,sizeof(h));ret+=dfs(S,inf);}return ret;
}
int dfn[MAX],low[MAX],G[MAX],gr,tim,St[MAX],top;
bool ins[MAX];
void Tarjan(int u)
{dfn[u]=low[u]=++tim;St[++top]=u;ins[u]=true;for(int i=h[u];i;i=e[i].next){if(!e[i].w)continue;int v=e[i].v;if(!dfn[v])Tarjan(v),low[u]=min(low[u],low[v]);else if(ins[v])low[u]=min(low[u],dfn[v]);}if(low[u]==dfn[u]){++gr;int v;do{v=St[top--];G[v]=gr;ins[v]=false;}while(u!=v);}
}
int main()
{n=read();m=read();S=read();T=read();for(int i=1;i<=m;++i){int u=read(),v=read(),w=read();Add(u,v,w);}Dinic();for(int i=1;i<=n;++i)if(!dfn[i])Tarjan(i);for(int i=2;i<cnt;i+=2)if(e[i].w)puts("0 0");else{if(G[e[i].v]^G[e[i^1].v])printf("1 ");else printf("0 ");if(G[e[i].v]==G[T]&&G[e[i^1].v]==G[S])puts("1");else puts("0");}return 0;
}
转载于:https://www.cnblogs.com/cjyyb/p/9794032.html
【BZOJ1797】[AHOI2009]最小割(网络流)相关推荐
- P4126 [AHOI2009]最小割(网络流/最小割)
P4126 [AHOI2009]最小割 https://www.cnblogs.com/dugudashen/p/6228304.html 求解一张有向图中关于最小割的可行边和必须边,可行边定义为存在 ...
- [AHOI2009]最小割【最小割+Tarjan】
题目链接 P4126 [AHOI2009]最小割 将题目拆解成两个问题,我们分别进行求解. 可以作为最小割的边 如果它可以是最小割中的边的话,首先它需要满足的是流过它的流是满流的,这是因为如果它被割去 ...
- [AHOI2009]最小割(最大流+tarjan)
继续填坑了,啦啦啦 这道题本来是准备枚举每个边,暂时去除它,但发现时间会爆炸的 于是决定另辟蹊径 于是这篇题解就应运而生 首先还是网络流跑一边 毕竟题目叫最小割嘛,给个面子 然后跑一边tarjan对满 ...
- 模板 - 最小割(常见最小割题型技巧总结)
整理的算法模板合集: ACM模板 目录 一.集合划分模型 二.点边转化 三.最小割的可行边与必须边 四.二分图的可行边和必须边 五.平面图最小割 六.最小割的一些小技巧 1.记录划分方案 2.求割边数 ...
- [bzoj1797][Ahoi2009]Mincut 最小割
来自FallDream的博客,未经允许,请勿转载,谢谢qaq A,B两个国家正在交战,其中A国的物资运输网中有N个中转站,M条单向道路.设其中第i (1≤i≤M)条道路连接了vi,ui两个中转站,那么 ...
- 边与最小割(bzoj 1797: [Ahoi2009]Mincut 最小割)
1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2471 Solved: 1067 [Subm ...
- 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)
I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...
- 【bzoj2521】[Shoi2010]最小生成树 网络流最小割
题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...
- 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流
«问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...
最新文章
- Linux那些事儿 之 戏说USB(1)它从哪里来
- Nuget很慢,我们该怎么办
- Windows服务器修改默认TTL值的方法
- sql优化中in关键字_工作中遇到的一个SQL优化问题与解决方案
- mysql中订单产品名,Ecshop后台订单列表增加”商品名”检索字段
- Spring 3.0 发布候选版 3 已经可用!
- 傅立叶:你让我如何理解你?
- OEL修改字符集失败 -bash: /root: is a directory
- idea java调用python代码
- matlab的基本语法规则_Matlab基本语法与指令
- B站视频怎么下载到本地【实用教程】
- 【HDLBits刷题笔记】Exams/ece241 2013 q7
- laser_filters源码整体分析
- (load和initialize)不要被你的log迷惑了你对问题的判断
- 【MATLAB深度学习工具箱】学习笔记--体脂估计算例再分析:拟合神经网络fitnet里面的函数】
- DDR3联合HDMI进行图片数据的传输
- 【渲染管线】关于透明度混合blend
- 有效逻辑地址所对应的物理地址
- 【qq机器人】Nonebot2搭建详细教程
- 通过数据库存储过程调用Web服务的办法