判断边是否在某个最小割集中 以及 判断边是否为最小割的必需边。
在残余网络中求出强连通分量,对于不在同一强连通分量且满流的边,必然在某一最小割中。
题目链接
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define min(a,b) ( (a)< (b)? (a): (b) )
int const N= 4010, M= 60010;
struct Edge{
int adj, flow, idx;
Edge* next;
}tb[M<<1];
int n, m, S, T, cnt;
Edge* mat[N];
inline void add( int u, int v, int idx, int f ){
++cnt;
tb[cnt].adj= v; tb[cnt].flow= f; tb[cnt].idx= idx;
tb[cnt].next= mat[u]; mat[u]= tb+ cnt;
++cnt;
tb[cnt].adj= u; tb[cnt].flow= 0; tb[cnt].idx= 0;
tb[cnt].next= mat[v]; mat[v]= tb+ cnt;
}
inline Edge* reserve( Edge* p ){
return tb+ ( (p- tb)^ 1 ); }
int que[N], head, tail, ht[N];
int bfs(){
for( int i= 0; i<= n; ++i ) ht[i]= -1;
que[0]= S; head= tail= 0; ht[S]= 0;
while( head<= tail ){
int u= que[head++];
for( Edge* p= mat[u]; p; p= p->next )
if( ht[p->adj]== -1 && p->flow ){
ht[p->adj]= ht[u]+ 1;
que[++tail]= p->adj;
}
}
return ht[T]!= -1;
}
int dfs( int u, int flow ){
if( u== T ) return flow;
int tf= 0, f;
for( Edge* p= mat[u]; p; p= p->next )
if( ht[p->adj]== ht[u]+ 1 && p->flow && flow> tf &&
( f= dfs( p->adj, min( p->flow, flow- tf ) ) ) ){
reserve( p )->flow+= f;
p->flow-= f;
tf+= f;
}
if( tf== 0 ) ht[u]= -1;
return tf;
}
int dep[M], low[M], ind[N], stack[N], top, num, id;
void SCC( int u ){
dep[u]= low[u]= ++num; stack[++top]= u;
for( Edge* p= mat[u]; p; p= p->next )
if( p->flow ){
int v= p->adj;
if( dep[v]== 0 ){
SCC( v );
if( low[v]< low[u] ) low[u]= low[v];
}
else if( low[v]!= n && dep[v]< low[u] )
low[u]= low[v];
}
if( dep[u]== low[u] ){
id++;
do{
ind[ stack[top] ]= id;
low[ stack[top] ]= n;
}while( stack[top--]!= u );
}
}
void solve(){
for( int i= 0; i<= n; ++i ){
dep[i]= 0; low[i]= 0; ind[i]= 0; }
num= 0; id= 0; top= -1;
for( int i= 1; i<= n; ++i )
if( dep[i]== 0 ) SCC( i );
for( int i= 0; i<= m; ++i ){
dep[i]= 0; low[i]= 0; }
for( int u= 1; u<= n; ++u )
for( Edge* p= mat[u]; p; p= p->next ){
int v= p->adj;
if( ind[u]!= ind[v] && p->flow== 0 ) dep[p->idx]= 1;
if( ind[u]!= ind[v] && p->flow== 0 &&
ind[u]== ind[S] && ind[v]== ind[T] ) low[p->idx]= 1;
}
for( int i= 1; i<= m; ++i )
printf("%d %d\n", dep[i], low[i] );
}
int main(){
while( scanf("%d%d%d%d", &n, &m, &S, &T )!= EOF ){
cnt= -1;
for( int i= 0; i<= n; ++i ) mat[i]= 0;
int u, v, d;
for( int i= 1; i<= m; ++i ){
scanf("%d%d%d", &u, &v, &d );
add( u, v, i, d );
}
int ans= 0;
while( bfs() ) ans+= dfs( S, 0x7fffffff );
solve();
}
return 0;
}
分享到:
相关推荐
《AHOI2009试题与测试数据详解》 AHOI,全称为"全国青少年信息学奥林匹克竞赛"(All-China High School Informatics Olympiad),是中国一项极具影响力的信息学竞赛,旨在选拔并培养优秀的信息技术人才。AHOI2009是...
2. `mincut`:这个名字暗示了最小割问题,这是一个经典的图论问题,通常用在网络流或最短路径算法中,比如Karger's Algorithm。 3. `checker`:可能是一个自动检查程序输出正确性的工具,用于验证参赛者代码的解决...
【标题解析】:“安徽省选AHOI试题及数据”这一标题揭示了该压缩包内容的核心,其中“安徽省选”指的是安徽省在信息技术领域的选拔比赛,可能是针对青少年的信息学奥林匹克竞赛(IOI)预选赛或者类似活动。“AHOI”...
**ahoi2012测试数据详解** "ahoi2012测试数据"是针对安徽省中学组竞赛的一份重要资料,它包含了该年度比赛所使用的试题和样例输入输出,旨在帮助参赛者熟悉竞赛环境,提升算法设计与编程能力。这类测试数据通常包括...
在“ahoi2012试题”这个压缩包中,很可能包含了一系列的编程题目,这些题目可能涵盖了从基础的逻辑思维到高级的算法设计,包括但不限于以下知识点: 1. **基础编程概念**:参赛者需要熟悉至少一种编程语言,如C++、...
洛谷P4248 [AHOI2013]差异 的 AC 代码
安徽省青少年信息学奥林匹克竞赛(AHOI)是针对青少年的一项重要的信息技术类竞赛,自1993年开始举办,旨在激发学生对计算机科学的兴趣,提升他们的编程能力与算法设计技巧。通过对1993年至2004年间AHOI团体获奖情况...
# [AHOI2008] 紧急集合 / 聚会 ## 题目描述 欢乐岛上有个非常好玩的游戏,叫做“紧急集合”。在岛上分散有 $n$ 个等待点,有 $n-1$ 条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有...
最小割性质【AHOI2009】 消圈定理 数据结构 树状斑点 线段树 划分树 平衡树(fhqtreap / splay) LCT 并查集 树 可并堆 可持久化数据结构 数学 数论 gcd / exgcd 费马(线性推逆元)/(EX)欧拉定理 米勒·拉宾...
LOJLOJLOJ 传送门 题解:首先考虑一棵树怎么做,就是树形 dpdpdp,然后我们可以枚举每一条边怎么选,显然有 3 种情况 进一步发现只需要枚举两种,即强制 uuu 选 vvv 不选,和强制 uuu 不选 vvv 随意 ...
作为一个计算机科学家,JYY有一套黑白色的拼图,他希望通过合理的拼接,使得拼出的最终图案中,能包含面积最大的全白色子矩形。之后JYY发现,可以通过改变这S块拼图
【故事背景】宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等。不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情。这些游戏往往都有很多的
AOI安徽省青少年信息学奥林匹克竞赛是针对小学组的信息学竞赛,主要是为了提高安徽省青少年对信息学的兴趣和逻辑思维能力,锻炼他们的计算思维和编程技能。该竞赛涉及的题目类型主要分为传统型,即给定具体的算法...
* AHOI2008:树上倍增算法可以用于解决AHOI2008问题,即求解树上三点的最近公共祖先。 * NOIP2013:树上倍增算法可以用于解决NOIP2013问题,即求解树上两点的最短路径。 树上倍增算法是一种非常有用的算法,用于...
问题描述:给定一个质数 p,定义一个数 x(1 ≤ x ) 模 p 的阶为:最小的正整数 t 使得 xt 模 p 等于 1(即 xt 除以 p 的余数为 1)。请帮助小多算若干组阶。 输入格式:输入文件名为 order.in。第一行是一个正整数 ...
coremedia-tools (c) Alexander Lenzen,Ahoi-IT。 mailto-name: al, mailto-domain: ahoi-it.de 有关许可信息,请参阅LICENSE.md 。目的这是一个 CoreMedia 命令行工具包。内容僵尸杀手Zombie-Killer 是一个工具,...
目录[TJOI2017]可乐[ZJOI2006]物流运输[HNOI/AHOI2018]道路[ZJOI2007]时态同步[TJOI2017]城市 [TJOI2017]可乐 tag上是分层图+矩阵优化,但是被我用暴力+滚动数组水过去了(赞美O2!)对每个点有三种状态,0:上一秒...
在"AHOI2007"这个压缩包中,可能包含了当年比赛的题目描述、输入输出样例、解题报告等资源,对于学习信息学竞赛的学生或者对此感兴趣的人,这是一个宝贵的资料库。通过深入研究这些题目,不仅能提升编程能力,还能...
mysql> grant all privileges on *.* to ahoi@'%' identified by '123456'; ``` 这一步骤是安全和同步的基础,确保了从机可以合法地从主机获取数据更新。 #### 主机配置 在主机的MySQL配置文件`/etc/my.cnf`中添加...