【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]最小割(网络流)相关推荐

  1. P4126 [AHOI2009]最小割(网络流/最小割)

    P4126 [AHOI2009]最小割 https://www.cnblogs.com/dugudashen/p/6228304.html 求解一张有向图中关于最小割的可行边和必须边,可行边定义为存在 ...

  2. [AHOI2009]最小割【最小割+Tarjan】

    题目链接 P4126 [AHOI2009]最小割 将题目拆解成两个问题,我们分别进行求解. 可以作为最小割的边 如果它可以是最小割中的边的话,首先它需要满足的是流过它的流是满流的,这是因为如果它被割去 ...

  3. [AHOI2009]最小割(最大流+tarjan)

    继续填坑了,啦啦啦 这道题本来是准备枚举每个边,暂时去除它,但发现时间会爆炸的 于是决定另辟蹊径 于是这篇题解就应运而生 首先还是网络流跑一边 毕竟题目叫最小割嘛,给个面子 然后跑一边tarjan对满 ...

  4. 模板 - 最小割(常见最小割题型技巧总结)

    整理的算法模板合集: ACM模板 目录 一.集合划分模型 二.点边转化 三.最小割的可行边与必须边 四.二分图的可行边和必须边 五.平面图最小割 六.最小割的一些小技巧 1.记录划分方案 2.求割边数 ...

  5. [bzoj1797][Ahoi2009]Mincut 最小割

    来自FallDream的博客,未经允许,请勿转载,谢谢qaq A,B两个国家正在交战,其中A国的物资运输网中有N个中转站,M条单向道路.设其中第i (1≤i≤M)条道路连接了vi,ui两个中转站,那么 ...

  6. 边与最小割(bzoj 1797: [Ahoi2009]Mincut 最小割)

    1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2471  Solved: 1067 [Subm ...

  7. 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)

    I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...

  8. 【bzoj2521】[Shoi2010]最小生成树 网络流最小割

    题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...

  9. 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

    «问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...

最新文章

  1. Linux那些事儿 之 戏说USB(1)它从哪里来
  2. Nuget很慢,我们该怎么办
  3. Windows服务器修改默认TTL值的方法
  4. sql优化中in关键字_工作中遇到的一个SQL优化问题与解决方案
  5. mysql中订单产品名,Ecshop后台订单列表增加”商品名”检索字段
  6. Spring 3.0 发布候选版 3 已经可用!
  7. 傅立叶:你让我如何理解你?
  8. OEL修改字符集失败 -bash: /root: is a directory
  9. idea java调用python代码
  10. matlab的基本语法规则_Matlab基本语法与指令
  11. B站视频怎么下载到本地【实用教程】
  12. 【HDLBits刷题笔记】Exams/ece241 2013 q7
  13. laser_filters源码整体分析
  14. (load和initialize)不要被你的log迷惑了你对问题的判断
  15. 【MATLAB深度学习工具箱】学习笔记--体脂估计算例再分析:拟合神经网络fitnet里面的函数】
  16. DDR3联合HDMI进行图片数据的传输
  17. 【渲染管线】关于透明度混合blend
  18. 有效逻辑地址所对应的物理地址
  19. 【qq机器人】Nonebot2搭建详细教程
  20. 通过数据库存储过程调用Web服务的办法

热门文章

  1. 两个实用的Python的装饰器
  2. 机器学习术语_机器学习术语神秘化。
  3. 40%美国人付不起400美元意外开销,大家怎么看?
  4. 为知笔记:优秀国产知识管理软件的使用心得
  5. VC中的cl.exe
  6. PIC32单片机harmony开发环境 - i2c例程和代码分析
  7. verilog赋多位值_verilog赋值
  8. access找不到输入表或者dual_在Access窗体中显示指定路径的图片
  9. emc文件存储服务器,emc存储怎么挂在linux服务器上
  10. tcp 三次握手与四次挥手_TCP三次握手与四次挥手详解