洛谷$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^ ...
随机推荐
- Jmeter监控
https://www.cnblogs.com/saryli/p/6596647.html JMeter是一款压力测试工具,我们也可以用它来监控服务器资源使用情况. JMeter正常自带可以通过Tom ...
- 开发板ping通虚拟机与主机
刚因为虚拟机与主机没法互相ping通的事情,奋战到将近凌晨一点.现在把这个过程总结一下,以方便后加入该行业的广大IT精英. VMWare提供了三种工作模式:bridged(桥接模式).NAT(网络地址 ...
- mysql 优化 1
一. 数据库索引 规则8:业务需要的相关索引是根据实际的设计所构造sql语句的where条件确定的,业务不需要的不要建索引,不允许在联合索引(或主键)中存在多余的字段,特别是该字段根本不会在条件语句中 ...
- CREATE OR REPLACE FUNCTION
CREATE OR REPLACE FUNCTION SF_Taishou_Ksai_Date(v_receiptNum IN CHAR, ...
- ios html5头部无法固定的问题(安卓正常)
需求:头部菜单导航固定,中间正文可以拉动,在安卓手机正常,在ios上下拉的时候头部被带下来,有卡顿用户体验也不会,解决方法如下: 有问题的布局代码 <div class="page&q ...
- H3C CSMA/CD载波侦听
- mysql怎么创建,删除,查看索引?
mysql是一个开源的应用非常广泛的数据库.mysql里面的索引能利用利用指针,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍.那么,怎么创建索引 ...
- Nginx 的 location
一.location语法 语法: Syntax: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... } Default: — ...
- Handler用法总结
一.线程通讯问题 1.1 Message.Handler.Looper 在Android中提供了一种异步回调机制Handler,我们可以它来完成一个很长时间的任务. Handler基本使用: 在主线程 ...
- Python--day69--ORM多对多查询
ManyToManyField class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器. 它存在于下面两种情况: 外键关系的反向查询 ...