题目链接 P4126 [AHOI2009]最小割


将题目拆解成两个问题,我们分别进行求解。

  • 可以作为最小割的边

如果它可以是最小割中的边的话,首先它需要满足的是流过它的流是满流的,这是因为如果它被割去了,那么一定是满流的,否则一定不会是最小割中的一条边。

再者,虽然它是满流的,但是它可以被替换掉,怎么理解?就是它现在表面上是别割去了,但是实际上图中还有残余网络,可以代替这条被割去的边。

给组合适的样例:

6 6 1 6
1 2 1
2 3 2
2 4 2
3 5 1
4 5 1
5 6 1
ans:
1 0
0 0
0 0
0 0
0 0
1 0

继续,求第一个问题好解,第二个问题,实际上,当这条边正向满流的时候,它的反向边就可以有残余流了,于是这就可以用Tarjan判环的思想,如果u、v在同一个环中,说明可以被残余网络替换掉,这时候就一定不能作为最小割中的边了。

  • 一定是最小割中的边

一定是最小割中的边的话,那么它就是无可替代的了,如果这条边(u到v)是无可替代的话,那么其实可以看作,在最大流跑完之后,源点可以流到u,并且v可以流到汇点。如果源点到不了u或者v到不了汇点,说明此时还有别的可以替代它作为最小割中的边的。

于是解决上述两个问题,这道题就解决了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 4e3 + 7, maxM = 1.2e5 + 7;
int N, M, head[maxN], cnt;
struct Eddge
{int nex, to, id; ll flow;Eddge(int a=-1, int b=0, ll c=0, int d=0):nex(a), to(b), flow(c), id(d) {}
} edge[maxM];
inline void addEddge(int u, int v, ll f, int id)
{edge[cnt] = Eddge(head[u], v, f, id);head[u] = cnt++;
}
inline void _add(int u, int v, ll f, int id) { addEddge(u, v, f, id); addEddge(v, u, 0, 0); }
struct Dinic
{int S, T, cur[maxN], node;int deep[maxN], que[maxN], top, tail;inline bool bfs(){for(int i=0; i<=node; i++) deep[i] = 0;top = tail = 0; que[tail++] = S; deep[S] = 1;while(top < tail){int u = que[top++];for(int i=head[u], v; ~i; i=edge[i].nex){v = edge[i].to; ll f = edge[i].flow;if(!deep[v] && f){deep[v] = deep[u] + 1;que[tail++] = v;}}}return deep[T];}ll dfs(int u, ll dist){if(u == T) return dist;for(int &i = cur[u], v; ~i; i=edge[i].nex){v = edge[i].to;ll f = edge[i].flow;if(deep[v] == deep[u] + 1 && f){ll flow = dfs(v, min(f, dist));if(flow){edge[i].flow -= flow;edge[i ^ 1].flow += flow;return flow;}}}return 0;}inline ll Max_Flow(){ll ans = 0, tmp;while(bfs()){for(int i=0; i<=node; i++) cur[i] = head[i];while((tmp = dfs(S, INF))) ans += tmp;}return ans;}
} mf;
int dfn[maxN], low[maxN], tot, Stap[maxN], Stop, Belong[maxN], Bcnt;
bool instack[maxN] = {false};
void Tarjan(int u)
{dfn[u] = low[u] = ++tot;Stap[++Stop] = u;instack[u] = true;for(int i=head[u], v; ~i; i=edge[i].nex){v = edge[i].to;if(!edge[i].flow) continue;if(!dfn[v]){Tarjan(v);low[u] = min(low[u], low[v]);}else if(instack[v]) low[u] = min(low[u], dfn[v]);}if(low[u] == dfn[u]){Bcnt++;int v;do{v = Stap[Stop--];instack[v] = false;Belong[v] = Bcnt;} while(u ^ v);}
}
struct Catch
{bool vis[maxN];queue<int> Q;void bfs(int u, int op){Q.push(u);vis[u] = true;while(!Q.empty()){u = Q.front(); Q.pop();for(int i=head[u], v; ~i; i=edge[i].nex){v = edge[i].to;if((!edge[i ^ op].flow)) continue;if(!vis[v]){Q.push(v);vis[v] = true;}}}}
} FS, FT;
pair<int, int> line[maxM];
bool ans_1[maxM] = {false}, ans_2[maxM] = {false};
inline void init()
{cnt = 0; mf.node = N;for(int i=0; i<=N; i++) head[i] = -1;
}
signed main()
{scanf("%d%d%d%d", &N, &M, &mf.S, &mf.T);init();for(int i=1, u, v, w; i<=M; i++){scanf("%d%d%d", &u, &v, &w);_add(u, v, w, i);line[i] = make_pair(u, v);}mf.Max_Flow();for(int i=1; i<=N; i++) if(!dfn[i]) Tarjan(i);for(int i=0, u, v; i<cnt; i += 2) if(!edge[i].flow){u = line[edge[i].id].first; v = line[edge[i].id].second;if(Belong[u] ^ Belong[v]) ans_1[edge[i].id] = true;}FS.bfs(mf.S, 0); FT.bfs(mf.T, 1);for(int i=0, u, v; i<cnt; i += 2) if(!edge[i].flow) //if(ans_1[edge[i].id]){u = line[edge[i].id].first; v = line[edge[i].id].second;if(FS.vis[u] && FT.vis[v]) ans_2[edge[i].id] = true;}for(int i=1; i<=M; i++) printf("%d %d\n", ans_1[i], ans_2[i]);return 0;
}

[AHOI2009]最小割【最小割+Tarjan】相关推荐

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

    正题 题目链接:https://www.luogu.com.cn/problem/P4126 题目大意 给出nnn个点mmm条边的一张有向图和起点终点.对于每条边求其是否是最小割的可行割/必须割 1≤ ...

  2. 【每日算法】【图论】【最小边覆盖 最小路径覆盖 最小顶点覆盖 最大独立集 最大团】

    最小边覆盖 = 最大独立集 = |V| - 最大匹配数 这个是在原图是二分图上进行的 最小路径覆盖和最小边覆盖不同,不要求给的图是二分图,而是要求是N x N的有向图,不能有环,然后根据原图构造二分图 ...

  3. 最小风险 最小错误 贝叶斯决策 Bayes(实例详解)

    文章目录 简介 最小错误率Bayes 例子 分析 最小风险的Bayes决策 最小风险Bayes决策规则: 例子 简介 贝叶斯决策其实是已经被很多博客解释的非常详细了,为了不制造学术垃圾,本来一直没打算 ...

  4. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

  5. Ural 1277 Cops and Thieves(最小点割集/最小割)

    题意:一个团伙去偷一个美术馆,警察决定在路上堵截.警察人数为k,不能在贼窝和美术馆驻扎,只能在图上其他点驻扎,而且驻扎有一个最小人数要求,问警察能否完成任务. 解法:又是最小点割集题目,每个点拆点即可 ...

  6. 比例割归一化割的拉普拉斯算子是怎么来的,有什么意义?

    这个问题的来由参见<社区发现之谱聚类算法手撕举例> 例:下图中7个点被分到了3个社区 邻接矩阵 A=[0100000101000001010000010100000101000001010 ...

  7. 打开计算机后 无法最小化,最小化窗口后无法在任务栏中显示的三种解决方法...

    [文章导读]最近有用户反映打开的窗口最小化后无法在任务栏中显示,通常情况下点击程序的最小化按钮都会显示在任务栏中,方便我们点击再次打开. 最近有用户反映打开的窗口最小化后无法在任务栏中显示,通常情况下 ...

  8. 桌面计算机最小化,最小化我的电脑窗口打开总是最小化,如何把它 – 手机爱问...

    2018-03-29 窗口最大化我的浏览器点击打开后,弹出的窗口总是最小化,该怎样解决? 最主要的是如何保持后面新弹出的窗口都是最大化的. 1.把所有的IE窗口关了;只打开一个IE窗口;最大化这个窗口 ...

  9. html 最小长度单位,最小的长度单位是多长?

    千米.米.厘米,这些都是我们常用的长度单位,那么,最小的长度单位是什么呢? 首先,在国际单位制中,长度的标准单位是"米",我国采用的长度单位与国际单位制是一致的,也是用" ...

  10. java项目割接_割接,割接...

    割接是最不能能忍受的的工作,可是从接收这块程序倒现在,已经为不同地区的业务割接了2次了,今天这是第三次.为了不影响用户使用,割接一般都是在夜里进行,可是今天不想加班了,就从中午开始,上传新的文件,更新 ...

最新文章

  1. 【linux】Valgrind工具集详解(二):入门
  2. 网站自己生成专题php,phpcms生成专题的同时自动生成专题相关文章
  3. 删除字符串中多余的空白字符和空行(C语言实现)
  4. 2020-12-11 Python yield 使用浅析
  5. Python面向对象---类的基本使用
  6. D8016“/ZI”和“/Gy-”命令行选项不兼容问题的解决
  7. 基于UDP的组播网络程序
  8. C# COM ArcgisEngine 多线程相关
  9. token什么意思中文_gre是什么意思中文
  10. CRFsuite 学习: CoNLL 2000 shared task
  11. [Python] 进制转换
  12. java 实现订单合并_向高手进阶,从 0 开始手写实现一个 RPC 框架!
  13. ASP.NET人力资源管理系统源码大型HR源码
  14. 开源软件漏洞安全风险分析
  15. 如何在电脑上给视频去水印
  16. MFQ(海盗派探索性测试)学习记录
  17. 【游戏测试】bug优先级的定义及如何描述
  18. 若依BaseEntity
  19. primeng的Tree初始化选中,实现联动效果
  20. 怎么登录163vip邮箱?163vip邮箱登录方式有哪些?

热门文章

  1. laradock 安装php扩展,laradock中安装Laravel Dusk详解
  2. TensorFlow入门教程(23)将图像超分辨率模型SRGAN移植到安卓APP(下)
  3. Java编程思想 第二十章 注解
  4. EBS 库存管理操作实例14——销售单发放(Sales Order Issue)
  5. python深度学习--DeepDream
  6. 普宁跨境电商外贸 之 到底要不要寄样品? 怎么寄样品?
  7. 偶然间听到一首不错的英文歌曲You're the inspiration Chicago ( Peter Cetera / David Foster )
  8. 芋道源码的周八(2018.01.14)
  9. 微信小程序申请手机登录
  10. 快钱等企业获支付牌照 NFC手机支付市场快速布局