「luogu - P4126」「ahoi 2009」最小割
也许题不错,反正有点降智…
先给结论,在
E_N=E \\
c(x,y)=w(x,y)
\]
的流网络中:
- 可行边:在增广完的 induced subgraph 中,不存在 \(u\) 到 \(v\) 的路径;
- 必要边:在增广完的 induced subgraph 中,可以从 \(S\) 到 \(u\) 且可以从 \(v\) 到 \(T\)。
先看可行边。不存在 \((u,v)\) 有两个条件,一个是 \(c_f(u,v)=0\),另一个是与之并联(特指以 \(u\) 为起点,\(v\) 为终点的)的线路中存在 \(c_f(u',v')=0\)。第一个的理解是,如果它没满流,则与之串联的 arcs 中存在比它的容量更小的边,根据最小割串联割最小的原则成立;第二个就是,如果你不把并联的砍了,你的划分压根不合法,何谈可行与否。
那么关于可行边的判断,把图缩点即可。
再看必要边。这个类比可行边即可,不赘述。
#include<bits/stdc++.h>
using namespace std;
int n,m,S,T,co[4100],dfsnt,colnt,inst[4100],sta[4100],top,dfn[4100],low[4100],vi[4100],rec[60100];
vector<pair<int,int>> arc;
template<typename T> struct network {
const int n;
struct edge {
int to,r; T w;
// friend bool operator<(const edge& one,const edge& ano) { return one.to<ano.to || (one.to==ano.to && one.r<ano.r); }
};
vector<vector<edge>> e;
vector<int> lev,iter;
network(int n):n(n),e(n+1),lev(n+1),iter(n+1) {}
void link(const int x,const int y,T w,int ID) {
assert(1<=x && x<=n && 1<=y && y<=n);
rec[ID]=int(e[x].size());
e[x].push_back((edge){y,int(e[y].size())+(x==y),w});
e[y].push_back((edge){x,int(e[x].size())-1,0});
}
bool BFS(const int s,const int t) {
queue<int> q; lev.assign(n+1,0);
for(q.push(s),lev[s]=1; q.size(); q.pop()) {
for(int now=q.front(),i=iter[now]=0,y; i<int(e[now].size()); ++i) {
if(now==t) return 1;
if(!lev[y=e[now][i].to] && e[now][i].w) lev[y]=lev[now]+1,q.push(y);
}
}
return lev[t];
}
T DFS(const int now,T f,const int t) {
if(now==t) return f;
T res=0,tt;
for(int& i=iter[now],y; i<int(e[now].size()); ++i) {
if(lev[y=e[now][i].to]==lev[now]+1 && e[now][i].w && (tt=DFS(y,min(f,e[now][i].w),t))) {
e[now][i].w-=tt; e[y][e[now][i].r].w+=tt; res+=tt; f-=tt;
if(!f) break;
}
}
if(!res) lev[now]=0;
return res;
}
T get(const int s,const int t) {
T res=0;
while(BFS(s,t)) res+=DFS(s,numeric_limits<T>::max(),t);
return res;
}
};
template<typename T=int> T rd() {
T x=0; char IO=getchar(); bool f=0;
while(IO<'0' || IO>'9') f|=IO=='-',IO=getchar();
while(IO>='0' && IO<='9') x=x*10+(IO&15),IO=getchar();
return f?-x:x;
}
void DFS(const int now,const network<int>& G) {
dfn[now]=low[now]=++dfsnt;
inst[sta[++top]=now]=1;
for(int i=0,y; i<int(G.e[now].size()); ++i) {
if(!G.e[now][i].w) continue;
if(!dfn[y=G.e[now][i].to]) DFS(y,G),low[now]=min(low[now],low[y]);
else if(inst[y]) low[now]=min(low[now],dfn[y]);
}
if(dfn[now]==low[now]) {
++colnt;
while(sta[top]!=now) co[sta[top]]=colnt,inst[sta[top]]=0,top--;
top--; co[now]=colnt; inst[now]=0;
}
}
void DFS_network(const int now,const network<int>& G,const int c) {
vi[now]=c;
for(int i=0,y; i<int(G.e[now].size()); ++i) {
if(!vi[y=G.e[now][i].to] && (c-1?G.e[y][G.e[now][i].r].w:G.e[now][i].w)) DFS_network(y,G,c);
}
}
signed main() {
freopen("mincut.in","r",stdin);
freopen("mincut.out","w",stdout);
n=rd(); m=rd(); S=rd(); T=rd();
network<int> G(n);
for(int i=0,x,y; i<m; ++i) x=rd(),y=rd(),G.link(x,y,rd(),i),arc.emplace_back(x,y);
for(int i=(G.get(S,T),1); i<=n; ++i) if(!dfn[i]) DFS(i,G);
DFS_network(S,G,1); DFS_network(T,G,2);
// for(int i=1; i<=n; ++i) printf(" --- %d ",vi[i]); puts("\n");
// for(int i=1; i<=n; ++i) printf(" --- %d ",co[i]); puts("");
// for(int i=1; i<=n; ++i) sort(G.e[i].begin(),G.e[i].end());
// for(int now=1; now<=n; ++now) {
// printf(" --- current node = %d:",now);
// for(int i=0; i<int(G.e[now].size()); ++i) printf(" %d",G.e[now][i].to);
// puts("");
// }
for(int i=0; i<m; ++i) {
// printf(" (%d %d)\n",arc[i].first,lower_bound(G.e[arc[i].first].begin(),G.e[arc[i].first].end(),(network<int>::edge){arc[i].second,0,0})->to);
// if(lower_bound(G.e[arc[i].first].begin(),G.e[arc[i].first].end(),(network<int>::edge){arc[i].second,0,0})->w) puts("0 0");
// printf(" (%d %d)[%d %d]\n",arc[i].first,G.e[arc[i].first][rec[i]].to,co[arc[i].first],co[G.e[arc[i].first][rec[i]].to]);
if(G.e[arc[i].first][rec[i]].w) puts("0 0");
else printf("%d %d\n",co[arc[i].first]!=co[arc[i].second],vi[arc[i].first]==1 && vi[arc[i].second]==2);
}
return 0;
}
「luogu - P4126」「ahoi 2009」最小割的更多相关文章
- 「Luogu P2060 [HNOI2006]马步距离」
一道神奇的BFS 前置芝士 BFS(DFS):这次真的不是我懒,我也不知道DFS怎么写. STL中的set或者map. 具体做法 数据范围非常大,直接BFS肯定是一片黑色(指TLE,MLE),直接贪心 ...
- 「SHOI2007」「Codevs2341」 善意的投票(最小割
2341 善意的投票 2007年省队选拔赛上海市队选拔赛 时间限制: 5 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 幼儿园里有n个小朋 ...
- BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路
问题描述 BZOJ1001 LG4001 题解 平面图最小割=对偶图最短路 假设起点和终点间有和其他边都不相交的一条虚边. 如图,平面图的若干条边将一个平面划分为若干个图形,每个图形就是对偶图中的一个 ...
- 【Luogu】P2057善意的投票(最小割转最大流)
题目链接 也算水题一道吧,不过Round1感性理解一下就xjb建了个图,40 Round2仔细分析了一会,理性建了个图,90 然后分析了半天……改大数组就A了…… 从S到所有值为1的点连一条inf的边 ...
- 【Luogu】P3355骑士共存问题(最小割)
题目链接 像题面那样把棋盘染成红黄点.发现骑士迈一步能到达的点的颜色一定是跟他所在的格子的颜色不同的.于是(woc哪来的于是?这个性质有这么明显吗?)从源点向所有红点连边,从所有黄点向汇点连边,红点向 ...
- BZOJ 4823 Luogu P3756 老C的方块 染色+最小割
题面太长了请各位自行品尝—>老C的方块 分析: 我们要解决掉所有使人弃疗的组合,还要保证花费最小,容易想到最小割(当然你要是想费用流的话,我们就没办法定义流量了) 我们来分析一下那些令人弃疗的组 ...
- Luogu SP839 OPTM - Optimal Marks(按位最小割)
这道题和 BZOJ 2400 是一道题,不多讲了 CODE #include <cstdio> #include <cstring> #include <vector&g ...
- loj#2020 「AHOI / HNOI2017」礼物 ntt
loj#2020 「AHOI / HNOI2017」礼物 链接 bzoj没\(letex\),差评 loj luogu 思路 最小化\(\sum\limits_1^n(a_i-b_i)^2\) 设改变 ...
- Loj #2495. 「AHOI / HNOI2018」转盘
Loj #2495. 「AHOI / HNOI2018」转盘 题目描述 一次小 G 和小 H 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1 ...
- Loj #2494. 「AHOI / HNOI2018」寻宝游戏
Loj #2494. 「AHOI / HNOI2018」寻宝游戏 题目描述 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得 ...
随机推荐
- shell工具和脚本
Shell脚本 shell 脚本是一种更加复杂度的工具. 大多数shell都有自己的一套脚本语言,包括变量.控制流和自己的语法.shell脚本 与其他脚本语言不同之处在于,shell 脚本针对 she ...
- P8933 [JRKSJ R7] 技巧性的块速递推 题解
题目传送门 题意: 简单来说就是一个涂色游戏. 有一个 n×m 的棋盘需要涂色. 每格只能涂黑色或白色两种颜色. 横.竖.斜连续 3 格颜色不能相同. 横.竖.斜连续 4 格颜色不能有 3 个相同颜色 ...
- 2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示 在节点网络中,只有当 graph[i][j] = 1 时,节点 i 能够直接连接到另一个节点 j。
2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示 在节点网络中,只有当 graph[i][j] = 1 时,节点 i 能够直接连接到另一个节点 j. ...
- @Deprecated注解的使用
被注解@Deprecated标记的程序元素是不鼓励使用的程序元素,通常是因为它很危险,或者是因为存在更好的替代方案. 除了对象自身引用自己用@Deprecated标记的方法外,其他情况使用@Depre ...
- Min-25 筛学习笔记
Min-25 筛学习笔记 \(\text{By DaiRuiChen007}\) 一.简要介绍 Min-25 筛,是一种能在亚线性时间内求出特定的一类积性函数 \(f(i)\) 的前缀和的算法. 具体 ...
- AR技术的应用与未来
目录 随着科技的不断进步,增强现实(AR)技术也在不断发展壮大.AR技术是一种通过计算机技术和传感器技术将虚拟信息融合到现实世界中的技术,可以为用户带来一种全新的.交互性更强的体验.本文将探讨AR技术 ...
- React后台管理系统11 配置项目初始化展开代码
在上一文中,我们已经配置好了,刷新默认打开选中的样式,但是如果是在/page3/1,这种的,并没有选中到/page3里面的/page3/1,这个地方来,所以我们需要解决的就是这几个问题: 思路如下: ...
- 组合数学知识整理_USTC-IAT期末复习版(已完结)
组合数学知识整理_USTC-IAT期末复习版(已完结) 第一章 排列与组合 第二章 递推关系与母函数 第三章 容斥原理与鸽巢原理 第四章 polya定理
- CF371D Vessels题解
思路: 定义一个权值并查集,权值保存这个集合还可以存下多少水. 如果这个集合可以存放的水已经小于要装入的水,就将这个集合与下一个集合合并. 否则,直接把这个集合可以存放的水减去要装入的水的体积. 代码 ...
- 【RabbitMQ】当队列中消息数量超过最大长度的淘汰策略
[RabbitMQ]当队列中消息数量超过最大长度的淘汰策略 说明 最近在研究RabbitMQ如何实现延时队列时发现消息进入死信队列的情况之一就是当消息数量超过队列设置的最大长度时会被丢入死信队列,看到 ...