BZOJ1001: [BeiJing2006]狼抓兔子 (最小割)
传送门
题目大意:求给出图的最小割(……题目就是这个意思)。
明眼一看,这就是一个裸的最大流,可是被数据范围吓住了,有106个点,然后又有3∗106条边,对于网络流可怜的O(n2m)的时间复杂度来说,简直是怪兽……但之前有同学告诉我,这道题就是最大流,我就硬着头皮上了一个ISAP,光荣超时,然后去找题解(想不出来了……)发现了两种,一种是把每一个面当做一个点,然后做最短路,即得最小割的容量,另一种竟然还是硬上网络流……黄学长用的dinic只用了800ms,而我之前的ISAP却用了15000+ms这不科学啊。然后我尝试着预标号,然后再ISAP,竟然只要500ms,太神了……
以后一定记住,要先预处理一遍!
代码:
/**************************************************************Problem: 1001User: geng4512Language: C++Result: AcceptedTime:552 msMemory:87896 kb
****************************************************************/#include<cstdio>
#include<cstring>
const int MAXN = 1001*1001;
inline int min(int a, int b) {return a < b ? a : b;}
int ecnt = -1;
struct node {int v, w, nxt;
}Edge[MAXN*6];
int Adj[MAXN], q[MAXN];
bool vis[MAXN];
void Addedge(int u, int v, int w) {node *t = &Edge[++ ecnt];t->v = v; t->w = w; t->nxt = Adj[u];Adj[u] = ecnt;t = &Edge[++ ecnt];t->v = u; t->w = w; t->nxt = Adj[v];Adj[v] = ecnt;
}
char c;
inline void GET(int &n) {n = 0;do c = getchar(); while(c > '9' || c < '0');while('0' <= c && c <= '9') {n=n*10+c-'0';c=getchar();}
}
int n, m, ans, S, T, d[MAXN], vd[MAXN], N;
int aug(int u, int augco) {int dmin = N-1, augc = augco, delta;if(u == T) return augco;for(int i = Adj[u]; ~i; i = Edge[i].nxt)if(Edge[i].w > 0) {if(d[Edge[i].v]+1 == d[u]) {delta = min(augc, Edge[i].w);delta = aug(Edge[i].v, delta);Edge[i].w -= delta;Edge[i^1].w += delta;augc -= delta;if(d[S] >= N) return augco - augc;if(!augc) return augco;}if(dmin > d[Edge[i].v]) dmin = d[Edge[i].v];}if(augco == augc) {-- vd[d[u]];if(!vd[d[u]]) d[S] = N;d[u] = ++ dmin;++ vd[dmin];}return augco - augc;}
void bfs() {int l = 0, r = 0, u;q[++ r] = T; vis[T] = 1; vd[0] ++;while(l < r) {u = q[++ l];for(int i = Adj[u]; ~i; i = Edge[i].nxt) {if(vis[Edge[i].v]) continue;d[Edge[i].v] = d[u] + 1;++ vd[d[u]+1];vis[Edge[i].v] = 1;q[++r] = Edge[i].v;}}
}
void sap() {bfs();while(d[S] < N)ans += aug(S, 0x7fffffff);
}
int main()
{int w;memset(Adj, -1, sizeof Adj);GET(n); GET(m);for(int i = 0; i < n; ++ i)for(int j = 0; j < m-1; ++ j) {GET(w);Addedge(i*m+j, i*m+j+1, w);}for(int i = 0; i < n-1; ++ i)for(int j = 0; j < m; ++ j) {GET(w);Addedge(i*m+j, (i+1)*m+j, w);}for(int i = 0; i < n-1; ++ i)for(int j = 0; j < m-1; ++ j) {GET(w);Addedge(i*m+j, (i+1)*m+j+1, w);}T = n*m-1; N = n*m;sap();printf("%d\n", ans);return 0;
}
转载于:https://www.cnblogs.com/geng4512/p/5296896.html
BZOJ1001: [BeiJing2006]狼抓兔子 (最小割)相关推荐
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- BZOJ1001[BeiJing2006]狼抓兔子——最小割
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- BZOJ 1001[BeiJing2006]狼抓兔子 最小割转最短路
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- bzoj1001 [BeiJing2006]狼抓兔子(最小割/平面图最大流转对偶图最短路)
首先这题显然就是求一个最小割.然后跑dinic加点优化也是可以过的. 这题还有一种更妙的做法:st平面图最大流转对偶图最短路.大概做法就是首先在原图中加一条s->t的边,然后把原图的一个面当作一 ...
- [BZOJ1001]: [BeiJing2006]狼抓兔子
题目描述 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对 ...
- bzoj1001:[BeiJing2006]狼抓兔子
传送门 最小割,一眼最小割,这个甚至不需要建什么模型,直接按它给的建就好了,最小割=最大流,跑个最大流就行了,注意:图是无向图 #include<cstdio> #include<q ...
- BZOJ1001 [BeiJing2006]狼抓兔子 (网络流)
题意分析 一看就是一道网络流的题目,然后上去最大流直接搞. 然后发现超时了,所以学了一波当前弧优化,然后就过了. 然后我觉得还可以再快一点,就IO加速了一下, 发现速度提高了400ms. 嗯,FAST ...
- 【BZOJ1001】狼抓兔子题解
BZOJ1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还 ...
- BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 23822 Solved: 6012 [Submit ...
- 【BZOJ1001】狼抓兔子
[BZOJ1001]狼抓兔子 题面 bzoj 题解 懒得平面图转对偶图了,直接最小割板子加优化. #include <iostream> #include <cstdio> # ...
最新文章
- 2020-2021Android中高级面试题大全
- VLC通信仿真中数字脉冲间隔调制(DPIM)实例
- Acwing第 18 场周赛【完结】
- input file 上传文件格式限制
- python解析xml文件elementtree_Python中使用ElementTree解析XML示例
- 什么是java序列化,如何实现java序列化?
- npoi excel 复制行_Excel的格式刷功能你真的会用吗?这样刷更加方便快捷
- mysql pxc启动_Percona XtraDB Cluster(PXC) 无法正常启动
- “Google只认钱!机器学习20年没进步”,CMU学者炮轰AI第一大厂
- kafka producer写入超时
- 安利几个优质nlp开源项目
- mysql 判断日志时间早_MySQL5.7慢查询日志时间与系统时间差8小时原因详解
- 强化学习(reinforcement learning)教程(后面是翻译)
- 幸运抽奖java_Java 幸运抽奖项目
- 保证接口数据安全的10种方案
- Stata软件做门槛回归模型(汉森个人主页上的代码)
- 麦子学院Linux教程:环境搭建
- 计算机黑屏的原因及解决办法,电脑突然黑屏重启的原因及解决办法
- 已解决:jdk版本冲突,nested exception is java.lang.UnsupportedClassVersionError:JVMCFRE003
- 卷积神经网络(CNN)超详细介绍