正题

题目链接:https://www.luogu.com.cn/problem/P4126


题目大意

给出\(n\)个点\(m\)条边的一张有向图和起点终点。对于每条边求其是否是最小割的可行割/必须割

\(1\leq n\leq 4000,1\leq m\leq 60000\)


解题思路

一些结论吧,首先是可行割,跑一次最大流,然后如果一条边是可行割需要满足

  • 该边满流
  • 残量网络上没有\(x,y\)之间的环

首先满流是显然的,然后第二个结论的话,如果它们之间有环,那么从\(y\)顺着环的方向逆流回去的话那么最大流不变但是这条边的流量减少了。

然后必须割的话也是两个条件

  • 该边满流
  • 残量网络上\(s\)能到\(x\),\(y\)能到\(t\)

这个我直接搬之前的证明了

证明:在残量网络上\(s\)可以到达\(x\)且\(y\)可以到达\(t\)那么说明若该边不割那么\(s\)就可以通过该边到达\(t\)。假设在\(s\)到\(x\)的路上有同样长度的一条道路且割掉后可以使\(s\)到达\(x\)那么在残量网络上该边的流量必定为0,因为切割掉\(x->y\)的流量也必定会经过该边所以在残量网络上\(s\)就不可以到达\(x\)了。所以该假设不成立。

证毕

所以跑完最大流再跑一次\(tarjan\)然后按照上面判就好了


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
const int N=4100,M=6e4+10,inf=1e9;
struct node{
int to,next,w;
}a[M<<1];
int n,m,s,t,tot,cnt,num,ls[N],id[M];
int dep[N],dfn[N],low[N],col[N];
bool ins[N];
stack<int> st;queue<int> q;
void addl(int x,int y,int w){
a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;
a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
return;
}
bool bfs(){
while(!q.empty())q.pop();q.push(s);
memset(dep,0,sizeof(dep));dep[s]=1;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=ls[x];i;i=a[i].next){
int y=a[i].to;
if(dep[y]||!a[i].w)continue;
dep[y]=dep[x]+1;
if(y==t)return 1;
q.push(y);
}
}
return 0;
}
int dinic(int x,int flow){
if(x==t)return flow;
int rest=0,k;
for(int i=ls[x];i;i=a[i].next){
int y=a[i].to;
if(dep[x]+1!=dep[y]||!a[i].w)continue;
rest+=(k=dinic(y,min(flow-rest,a[i].w)));
a[i].w-=k;a[i^1].w+=k;
if(rest==flow)return rest;
}
if(!rest)dep[x]=0;
return rest;
}
void tarjan(int x){
dfn[x]=low[x]=++cnt;
ins[x]=1;st.push(x);
for(int i=ls[x];i;i=a[i].next){
int y=a[i].to;
if(!a[i].w)continue;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(ins[y])
low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
int k;++num;
do{
k=st.top();st.pop();
col[k]=num;ins[k]=0;
}while(k!=x);
}
return;
}
signed main()
{
scanf("%d%d%d%d",&n,&m,&s,&t);tot=1;
for(int i=1;i<=m;i++){
int x,y,w;id[i]=tot+1;
scanf("%d%d%d",&x,&y,&w);
addl(x,y,w);
}
while(bfs())
dinic(s,inf);
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
for(int i=1;i<=m;i++){
int x=a[id[i]^1].to,y=a[id[i]].to;
if(a[id[i]].w==0&&col[x]!=col[y])putchar('1');else putchar('0');putchar(' ');
if(a[id[i]].w==0&&col[x]==col[s]&&col[y]==col[t])putchar('1');else putchar('0');putchar('\n');
}
return 0;
}

P4126-[AHOI2009]最小割【网络流,tarjan】的更多相关文章

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

    P4126 [AHOI2009]最小割 边$(x,y)$是可行流的条件: 1.满流:2.残量网络中$x,y$不连通 边$(x,y)$是必须流的条件: 1.满流:2.残量网络中$x,S$与$y,T$分别 ...

  2. P4126 [AHOI2009]最小割

    题目地址:P4126 [AHOI2009]最小割 最小割的可行边与必须边 首先求最大流,那么最小割的可行边与必须边都必须是满流. 可行边:在残量网络中不存在 \(x\) 到 \(y\) 的路径(强连通 ...

  3. 洛谷P4126 [AHOI2009]最小割

    题目:洛谷P4126 [AHOI2009]最小割 思路: 结论题 在残余网络上跑tarjan求出所有SCC,记id[u]为点u所在SCC的编号.显然有id[s]!=id[t](否则s到t有通路,能继续 ...

  4. 洛谷$P4126\ [AHOI2009]$最小割 图论

    正解:网络流+$tarjan$ 解题报告: 传送门$QwQ$ $umm$最小割的判定问题$QwQ$,因为并不会做是看的题解才会的,所以也没什么推导过程直接放结论趴$QwQ$ 首先跑个最大流,然后有. ...

  5. 【BZOJ1797】[AHOI2009]最小割(网络流)

    [BZOJ1797][AHOI2009]最小割(网络流) 题面 BZOJ 洛谷 题解 最小割的判定问题,这里就当做记结论吧.(源自\(lun\)的课件) 我们先跑一遍最小割,求出残量网络.然后把所有还 ...

  6. 【bzoj1797】[Ahoi2009]Mincut 最小割 网络流最小割+Tarjan

    题目描述 给定一张图,对于每一条边询问:(1)是否存在割断该边的s-t最小割 (2)是否所有s-t最小割都割断该边 输入 第一行有4个正整数,依次为N,M,s和t.第2行到第(M+1)行每行3个正 整 ...

  7. BZOJ 1797: [Ahoi2009]Mincut 最小割( 网络流 )

    先跑网络流, 然后在残余网络tarjan缩点. 考虑一条边(u,v): 当且仅当scc[u] != scc[v], (u,v)可能出现在最小割中...然而我并不会证明 当且仅当scc[u] = scc ...

  8. bzoj 1797: [Ahoi2009]Mincut 最小割【tarjan+最小割】

    先跑一遍最大流,然后对残量网络(即所有没有满流的边)进行tarjan缩点. 能成为最小割的边一定满流:因为最小割不可能割一半的边: 连接s.t所在联通块的满流边一定在最小割里:如果不割掉这条边的话,就 ...

  9. AHOI2009最小割

    1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1072  Solved: 446[Submit] ...

  10. BZOJ1797:[AHOI2009]最小割(最小割)

    Description A,B两个国家正在交战,其中A国的物资运输网中有N个中转站,M条单向道路.设其中第i (1≤i≤M)条道路连接了vi,ui两个中转站,那么中转站vi可以通过该道路到达ui中转站 ...

随机推荐

  1. 并发容器之ConcurrentHashMap

    JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都 串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低 ...

  2. 如何将eclipse中项目部署到tomcat

    项目路径: \tmp0\wtpwebapps\test 复制test目录到 D:\software_install\apache-tomcat-8.0.33-windows-x64\apache-to ...

  3. 关于SequenceInputStream

    两个流合并时: package stream.sequence; import java.io.BufferedReader; import java.io.BufferedWriter; impor ...

  4. 五分钟搞定Docker安装ElasticSearch

    前言 项目准备上ElasticSearch,为了后期开发不卡壳只能笨鸟先飞,在整个安装过程中遇到以下三个问题. Docker安装非常慢 ElasticSearch-Head连接出现跨域 Elastic ...

  5. springMVC学习总结(二) --springMVC表单处理、标签库、静态文件处理

    根据springMVC学习总结(一) --springMVC搭建 搭建项目 一.表单处理 1.创建两个java类 Student.java, StudentController.java. 2.在js ...

  6. MySQL——日志管理

    一.MySQL日志类型 1.错误:--log--error ---------------------*** host_name.err 2.常规: --general_log host_name.l ...

  7. 20200713晚 noip14

    考场 很紧张,上午考太烂了 开场看到"影魔",想起以前看过(但没做),心态爆炸,咆哮时被 hkh diss 了 T1 一开始想建边跑最长路,每个点在记录一下 \(\min\{a\} ...

  8. Python - 执行cmd命令

    python操作cmd 我们通常可以使用os模块的命令进行执行cmd 方法一:os.system os.system(执行的命令) # 源码 def system(*args, **kwargs): ...

  9. WEB漏洞——文件上传

    有关文件上传的知识 为什么文件上传存在漏洞 上传文件时,如果服务端代码未对客户端上传的文件进行严格的验证和过滤就容易造成可以上传任意文件的情況,包括上传脚本文件(asp.aspx.php.jsp等格式 ...

  10. jvm学习笔记:虚拟机栈

    虚拟机栈 Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same ...