P4126-[AHOI2009]最小割【网络流,tarjan】

正题

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


题目大意

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

1≤n≤4000,1≤m≤600001\leq n\leq 4000,1\leq m\leq 600001n4000,1m60000


解题思路

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

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

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

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

  • 该边满流
  • 残量网络上sss能到xxxyyy能到ttt

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

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

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


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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

调试.NET CORE代码

前言core也用了很长一段时间了&#xff0c;发现很多小伙伴不知道如何调试core的代码。可想而知&#xff0c;以前使用mvc的时候&#xff0c;不需要发布代码&#xff0c;直接iis地址指向项目源码&#xff0c;然后附加到进程w3wp.exe就可以调试了。在core的项目里面已经不能这样玩…

牛客题霸 [二叉树中是否存在节点和为指定值的路径] C++题解/答案

牛客题霸 [二叉树中是否存在节点和为指定值的路径] C题解/答案 题目描述 给定一个二叉树和一个值\ sum sum&#xff0c;判断是否有从根节点到叶子节点的节点值之和等于\ sum sum 的路径&#xff0c; 例如&#xff1a; 给出如下的二叉树&#xff0c;\ sum22 sum22&#xff0c;…

P4292-[WC2010]重建计划【长链剖分,线段树,0/1分数规划】

正题 题目链接:https://www.luogu.com.cn/problem/P4292 题目大意 给出nnn个点的一棵树&#xff0c;然后求长度在[L,U][L,U][L,U]之间的一条路径的平均权值最大。 解题思路 先上二分0/10/10/1分数规划&#xff0c;然后变成求最长在[L,U][L,U][L,U]之间的路径。 很经典的点分…

HDU4035 Maze(树上期望)

Maze 状态表示&#xff1a;fuf_ufu​表示在uuu节点走出迷宫期望次数&#xff0c;dud_udu​表示度数 首先很容易想到下面式子fukuf1(1−ku−eu)∑u→vfv1duf_uk_uf_1(1-k_u-e_u)\frac{\sum _{u\to v}f_v1}{d_u}fu​ku​f1​(1−ku​−eu​)du​∑u→v​fv​1​ 每个节点有一个类…

从头开始学eShopOnContainers——Visual Studio 2017环境配置

一、安装和配置Docker环境1、安装Docker CE for Windows从官方网站下载并安装&#xff0c;https://docs.docker.com/docker-for-windows/install/。默认情况下Docker for Windows使用Hyper-V运行Linux VM。 如果您没有安装/启用Hyper-V&#xff0c;它将被安装&#xff0c;您可能…

牛客题霸 [判断二叉树是否对称] C++题解/答案

[牛客题霸 [判断二叉树是否对称] C题解/答案](https://www.nowcoder.com/practice/1b0b7f371eae4204bc4a7570c84c2de1?tpId117&&tqId34937&rp1&ru/ta/job-code-high&qru/ta/job-code-high/question-ranking) 题目描述 给定一棵二叉树&#xff0c;判断琪…

ASP.NET Core 生成验证码

点击蓝字关注我使用验证码保护网站免受垃圾信息的选择有很多&#xff0c;比如Google ReCaptcha和captcha.com。这两者都可以整合到ASP.NET Core应用中去。然而&#xff0c;如果你出于某些原因&#xff0c;仍然希望自己写验证码&#xff0c;例如你下网站需要在中国大陆使用&…

P4756-Added Sequence【斜率优化】

正题 题目链接:https://www.luogu.com.cn/problem/P4756 题目大意 给出序列aaa&#xff0c;设f(l,r)∣∑ilrai∣f(l,r)|\sum_{il}^ra_i|f(l,r)∣∑ilr​ai​∣。 mmm次询问若序列aaa全部加上某个数xxx&#xff0c;求最大的f(l,r)f(l,r)f(l,r)。 1≤n,m≤21051\leq n,m\leq 2\…

P4564 [CTSC2018]假面(期望)

P4564 [CTSC2018]假面 首先容易看出结界技能对第二问敌方剩余生命值期望没有影响。 如何求出第iii个人的剩余生命值期望&#xff1f; 只需要根据Ei∑j0aijfi,jE_i\sum_{j0}^{a_i}jf_{i,j}Ei​∑j0ai​​jfi,j​ 预处理fi,jf_{i,j}fi,j​&#xff1a;第iii个人的剩余生命值为j…

牛客题霸 [连续子数组的最大和] C++题解/答案

牛客题霸 [连续子数组的最大和] C题解/答案 题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含…

P4234-最小差值生成树【LCT】

正题 题目链接:https://www.luogu.com.cn/problem/P4234 题目大意 给出nnn个点mmm条边的一张图。求一棵生成树使得最大边权减去最小边权最小。 1≤n≤5104,1≤m≤21051\leq n\leq 5\times 10^4,1\leq m\leq 2\times 10^51≤n≤5104,1≤m≤2105 解题思路 按照边权排序&#x…

【.NET Core项目实战-统一认证平台】第六章 网关篇-自定义客户端授权

上篇文章【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis 我们介绍了网关使用Redis进行缓存&#xff0c;并介绍了如何进行缓存实现&#xff0c;缓存信息清理接口的使用。本篇我们将介绍如何实现网关自定义客户端授权&#xff0c;实现可以为不同的接入客户端设…

2287. 【POJ Challenge】消失之物(数组递推\分治优化背包)

2287. 【POJ Challenge】消失之物 这题的思想和P4564 [CTSC2018]假面优化的思想一样&#xff0c;应该反过来说&#xff0c;假面那个题应该是借鉴这题的思路。 显然不能枚举每个物品消失O(n)O(n)O(n)&#xff0c;然后跑背包O(nm)O(nm)O(nm) 预处理dp fjf_jfj​表示nnn个物品装…

如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇) - 广州.net微软技术俱乐部12月份活动报名帖...

这是广州.net微软技术俱乐部12月份活动报名帖。此帖会持续更新。活动课程标题是&#xff1a;如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇)这是内容大纲&#xff1a;ABP框架简介&#xff08;这里会聊聊.net真的不如JAVA吗&#xff1f;&#xff09;快的定义!用ABP…

P5012-水の数列【并查集,RMQ】

正题 题目链接:https://www.luogu.com.cn/problem/P5012 题目大意 nnn个数字的一个序列&#xff0c;TTT次询问给出[l,r][l,r][l,r]要求 找出一个最大的xxx满足。提出所有的小于xxx的数&#xff0c;然后被提出的数的连续区间长度平方和除以xxx的值最大要求分出来的区间个数在[…

牛客题霸 [ 换钱的最少货币数] C++题解/答案

牛客题霸 [ 换钱的最少货币数] C题解/答案 题目描述 给定数组arr&#xff0c;arr中所有的值都为正整数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币可以使用任意张&#xff0c;再给定一个aim&#xff0c;代表要找的钱数&#xff0c;求组成aim的最少货币数。…

codeforces gym100959 I - Robots(稠密图建图优化)

I - Robots 显然可以两点之间能连边就连边&#xff0c;但是边数会很多&#xff0c;考虑优化 对于三个点(x0,y0)(x_0,y_0)(x0​,y0​)&#xff0c;(x0,y1)(x_0,y_1)(x0​,y1​)&#xff0c;(x0,y2)(x_0,y_2)(x0​,y2​) 如果三个点的方向都是UUU 那么没有必要1→31\to 31→3连…

.Net Core微服务系列--开篇

得原来有个项目是用wcf做的分布式&#xff0c;不仅横向根据业务拆分了&#xff0c;纵向把业务处理、数据访问等也拆分了成不同的服务&#xff0c;这个是当时公司的产品我也只是一个小小的开发人员所以就不做太多的评论&#xff0c;只是不得不吐槽下调试真的太麻烦。后来&#x…

牛客题霸 [ 树的直径] C++题解/答案

牛客题霸 [ 树的直径] C题解/答案 题目描述 给定一棵树&#xff0c;求出这棵树的直径&#xff0c;即两个节点距离的最大值。 题解&#xff1a; 不知道大家听没听过一个结论&#xff1a; 树的直径可以通过两边dfs找到 步骤&#xff1a; 1.从任意一点进行dfs&#xff0c;然后…

GDOI2021划水记

Day0 上午有意志行&#xff0c;一大早就醒了&#xff0c;然后走了五个小时脚痛。中午洗澡&#xff0c;宿舍轮流看巨人最终话然后聊了一个小时&#xff1f; 下午老师带着我和全爷先开溜&#xff0c;宿舍好像很破旧还还没得充电&#xff0c;领了牌牌和斐爷去吃饭。 然后六点多和…