洛谷$P4126\ [AHOI2009]$最小割 图论
正解:网络流+$tarjan$
解题报告:
$umm$最小割的判定问题$QwQ$,因为并不会做是看的题解才会的,所以也没什么推导过程直接放结论趴$QwQ$
首先跑个最大流,然后有.
1)可行流($x,y$)的充要条件:满流&残余网络中不存在$x$到$y$的路径
2)必然流($x,y$)的充要条件:满流&残余网络中$ST$分别能到达$xy$
证明的话都可以用反证法?
对于1,挺显然的还,就如果存在$x$到$y$的路径,说明并没有割开,显然不属于最小割
对于2,我取一边为例,若$S$不能到达$x$,则说明一定有一条边也能被割开,则可以割开那条边,因此这条边不是必然边.$over$
然后具体体现的话就是.
1)满流&$xy$不属于一个$SCC$中
2)满流&$xy$分别与$ST$属于一个$SCC$中
所以就跑个最大流然后跑个$tarjan$就欧克!$over$
补一个易错点,,,虽然我$jio$得可能就我一个人那么傻逼被这个傻逼的易错点坑了1$h$,,,$QAQ$
就,在用当前弧优化的时候不是要在每次$dinic$中$bfs$后给所有$cur$赋值为$head$嘛,因为我之前一直是$S$是最小$T$是最大所以我就一直打的$for(S,T)$.但是在这题里应该是$for(1,n)$,,,$QAQ$
没了,$over$
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define n(i) edge[i].nxt
#define ri register int
#define rb register int
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];~i;i=n(i)) const int N=+,M=+,inf=1e9;
int n,m,dep[N],head[N],cur[N],S,T,ed_cnt=-,dfn[N],low[N],tim,stck[N],tp,bl[N],bl_cnt;
bool instck[N];
struct ed{int to,nxt,wei;}edge[M<<]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ri x,ri y,ri z)
{edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],};head[x]=ed_cnt;}
il bool bfs()
{
queue<int>Q;Q.push(S);memset(dep,,sizeof(dep));dep[S]=;
while(!Q.empty()){ri nw=Q.front();Q.pop();e(i,nw)if(w(i) && !dep[t(i)]){dep[t(i)]=dep[nw]+,Q.push(t(i));}}
return dep[T];
}
il int dfs(ri nw,ri flow)
{
if(nw==T || !flow)return flow;ri ret=;
for(ri &i=cur[nw];~i;i=n(i))
if(w(i) && dep[t(i)]==dep[nw]+){ri d=dfs(t(i),min(flow,w(i)));w(i)-=d,flow-=d,ret+=d,w(i^)+=d;}
return ret;
}
il int dinic()
{ri ret=;while(bfs()){rp(i,,n)cur[i]=head[i];while(int d=dfs(S,inf))ret+=d;}return ret;}
il void tarjan(ri x)
{
dfn[x]=low[x]=++tim;stck[++tp]=x;instck[x]=;
e(i,x)if(w(i)){if(!dfn[t(i)])tarjan(t(i)),low[x]=min(low[x],low[t(i)]);else if(instck[t(i)])low[x]=min(low[x],dfn[t(i)]);}
if(!(low[x]^dfn[x])){++bl_cnt;ri tmp;do{tmp=stck[tp--];bl[tmp]=bl_cnt;instck[tmp]=;}while(tmp!=x);}
} int main()
{
//freopen("4126.in","r",stdin);freopen("4126.out","w",stdout);
memset(head,-,sizeof(head));n=read();m=read();S=read();T=read();
rp(i,,m){ri x=read(),y=read(),z=read();ad(y,x,z);}dinic();
rp(i,,n)if(!dfn[i])tarjan(i);
rp(i,,m)
{
ri ed_nam=(i-)<<;
if(w(ed_nam)){printf("0 0\n");continue;}
if(bl[t(ed_nam)]^bl[t(ed_nam^)])printf("1 ");else printf("0 ");
if(bl[t(ed_nam)]^bl[T] || bl[t(ed_nam^)]^bl[S])printf("0\n");else printf("1\n");
}
return ;
}
洛谷$P4126\ [AHOI2009]$最小割 图论的更多相关文章
- 洛谷P4126 [AHOI2009]最小割
题目:洛谷P4126 [AHOI2009]最小割 思路: 结论题 在残余网络上跑tarjan求出所有SCC,记id[u]为点u所在SCC的编号.显然有id[s]!=id[t](否则s到t有通路,能继续 ...
- P4126 [AHOI2009]最小割
题目地址:P4126 [AHOI2009]最小割 最小割的可行边与必须边 首先求最大流,那么最小割的可行边与必须边都必须是满流. 可行边:在残量网络中不存在 \(x\) 到 \(y\) 的路径(强连通 ...
- P4126 [AHOI2009]最小割(网络流+tarjan)
P4126 [AHOI2009]最小割 边$(x,y)$是可行流的条件: 1.满流:2.残量网络中$x,y$不连通 边$(x,y)$是必须流的条件: 1.满流:2.残量网络中$x,S$与$y,T$分别 ...
- POJ 2914 Minimum Cut 最小割图论
Description Given an undirected graph, in which two vertices can be connected by multiple edges, wha ...
- 洛谷.4897.[模板]最小割树(Dinic)
题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...
- 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码
洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...
- 【洛谷P2494】 [SDOI2011]保密(分数规划+最小割)
洛谷 题意: 题意好绕好绕...不想写了. 思路: 首先类似于分数规划做法,二分答案得到到每个点的最小危险度. 然后就是在一个二分图中,两边撤掉最少的点(相应代价为上面算出的危险度)及相应边,使得中间 ...
- 【洛谷P3329】 [ZJOI2011]最小割(最小割树)
洛谷 题意: 给出一个无向图,之后有\(q,q\leq 30\)组询问,每组询问有一个\(x\),回答有多少点对\((a,b)\)其\(a-b\)最小割不超过\(x\). 思路: 这个题做法要最小割树 ...
- 【洛谷P3973】[TJOI2015]线性代数(最小割)
洛谷 题意: 给出一个\(n*n\)的矩阵\(B\),再给出一个\(1*n\)的矩阵\(C\). 求一个\(1*n\)的\(01\)矩阵\(A\),使得\(D=(A\cdot B-C)\cdot A^ ...
随机推荐
- Keycode对照表(键码对照表)
https://segmentfault.com/a/1190000005828048 字母和数字键的键码值(keyCode) 按键 键码 按键 键码 按键 键码 按键 键码 A 65 J 74 S ...
- 8-2udp和tcp网络编程以及粘包和解决粘包的方法
一 tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...
- PyODPS DataFrame 处理笛卡尔积的几种方式
PyODPS 提供了 DataFrame API 来用类似 pandas 的接口进行大规模数据分析以及预处理,本文主要介绍如何使用 PyODPS 执行笛卡尔积的操作. 笛卡尔积最常出现的场景是两两之间 ...
- AFNetworkingErrorDomain 错误
AFNetworking and POST Request I'm getting this response in error.userInfo while making a POST reques ...
- JVM参数详细列表
-client :设置JVM使用client模式,特点启动较快(神机不明显(I5/8G/SSD)) -server :设置JVM使用server模式.64位JDK默认启动该模式 -agentlib:l ...
- @bzoj - 4379@ [POI2015] Modernizacja autostrady
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一棵无根树,边权都是1,请去掉一条边并加上一条新边,定义直径 ...
- 带你进入 Activiti 工作流的世界
Activiti 是一个针对企业用户.开发人员 .系统管理员的轻量级工作流业务管理平台,其核心是使用 java 开发的快速 . 稳定的 BPMN2.0 流程引擎 .它可以与 spring 完美集成. ...
- SuperSocket 中的日志系统
当 SuperSocket boostrap 启动时,日志系统将会自动启动. 所以你无须创建自己的日志工具,最好直接使用SuperSocket内置的日志功能. SuperSocket 默认使用log4 ...
- Python--day65--模板语言之变量相关语法
Django的模板语言: 1.目前已经学过的模板语言: 2,模板语言总结: 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Djan ...
- dotnet 设计规范 · 抽象定义
严格来说,只有一个类被其他的类继承,那么这个类就是基类.在很多时候,基类的定义是提供足够的抽象和通用方法和属性.默认实现.在继承关系中,基类定义在上层抽象和底层自定义之间. 他们充当抽象实现的实现帮助 ...