bzoj1001狼抓兔子——网络流平面图问题
来源:互联网 发布:红酒网络推广方案 编辑:程序博客网 时间:2024/05/22 01:41
1001: [BeiJing2006]狼抓兔子
Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 25715 Solved: 6529
[Submit][Status][Discuss]
Description
现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,
而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:
左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路
1:(x,y)<==>(x+1,y)
2:(x,y)<==>(x,y+1)
3:(x,y)<==>(x+1,y+1)
道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,
开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下解(N,M)的窝中去,狼王开始伏击
这些兔子.当然为了保险起见,如果一条道路上最多通过的兔子数为K,狼王需要安排同样数量的K只狼,
才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的
狼的数量要最小。因为狼还要去找喜羊羊麻烦.
Input
第一行为N,M.表示网格的大小,N,M均小于等于1000.
接下来分三部分
第一部分共N行,每行M-1个数,表示横向道路的权值.
第二部分共N-1行,每行M个数,表示纵向道路的权值.
第三部分共N-1行,每行M-1个数,表示斜向道路的权值.
输入文件保证不超过10M
Output
输出一个整数,表示参与伏击的狼的最小数量.
Sample Input
3 4
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
Sample Output
14
HINT
2015.4.16新加数据一组,可能会卡掉从前可以过的程序。
Source
HOME Back
其实就是一道模板题……然而建成了单向边……用的是isap,双向边只需要在建边的时候把反向边建成cap就好了
inline void add_edge(int x, int y, int cap) { e[p] = Edge(y, h[x], cap, 0); h[x] = p++; e[p] = Edge(x, h[y], cap, 0); h[y] = p++;}
然后……没有然后
#include <bits/stdc++.h>using namespace std;const int MAXN = 1000003;const int MAXE = 6000003;const int INF = 0x3f3f3f3f;struct Edge{ int to, nxt, cap, flow; Edge() {} Edge(int to, int nxt, int cap, int flow):to(to), nxt(nxt), cap(cap), flow(flow) {}}e[MAXE];int n, m;int h[MAXN], p;int source, sink, tot;int pre[MAXN], num[MAXN], cur[MAXN];int d[MAXN];bool vis[MAXN];queue<int> q; inline void add_edge(int x, int y, int cap) { e[p] = Edge(y, h[x], cap, 0); h[x] = p++; e[p] = Edge(x, h[y], cap, 0); h[y] = p++;} void bfs() { memset(vis, 0, sizeof(vis)); q.push(sink); vis[sink] = 1; d[sink] = 0; while(!q.empty()) { int u = q.front(); q.pop(); num[d[u]]++; for(int i = h[u]; ~i; i = e[i].nxt) { int v = e[i].to; if(!vis[v]) { vis[v] = 1; d[v] = d[u] + 1; q.push(v); } } }} void augment(int flow) { for(int i = source; i != sink; i = e[cur[i]].to) { e[cur[i]].flow += flow; e[cur[i] ^ 1].flow -= flow; }} int isap() { memset(num, 0, sizeof(num)); bfs(); memcpy(cur, h, sizeof(h)); int u = source, flow = 0, f = INF; while(d[source] < tot) { bool fg = 0; for(int i = cur[u]; ~i; i = e[i].nxt) { if(e[i].cap > e[i].flow && d[u] == d[e[i].to] + 1) { pre[e[i].to] = u; cur[u] = i; u = e[i].to; f = min(f, e[i].cap - e[i].flow); fg = 1; if(u == sink) { flow += f; augment(f); f = INF; u = source; } break; } } if(fg) continue; if(--num[d[u]] == 0) break; int M = tot - 1; for(int i = h[u]; ~i; i = e[i].nxt) { if(e[i].cap > e[i].flow && M > d[e[i].to]) { M = d[e[i].to]; cur[u] = i; } } num[d[u] = M + 1]++; if(u != source) u = pre[u]; } return flow;}signed main() { scanf("%d%d",&n,&m); int x; source = 1; sink = n * m; tot = sink; memset(h, -1, sizeof(h)); for(int i = 1; i <= n; i++) for(int j = 1; j < m; j++) { scanf("%d",&x); add_edge(m * (i - 1) + j, m * (i - 1) + j + 1, x); } for(int i = 1; i < n; i++) for(int j = 1; j <= m; j++) { scanf("%d",&x); add_edge(m * (i - 1) + j, m * (i) + j, x); } for(int i = 1; i < n; i++) for(int j = 1; j < m; j++) { scanf("%d",&x); add_edge(m * (i - 1) + j, m * (i) + j + 1, x); } printf("%d\n", isap());}
阅读全文
0 0
- bzoj1001狼抓兔子——网络流平面图问题
- 【BZOJ1001】【平面图最小割】狼抓兔子
- BZOJ1001狼抓兔子(平面图最小割)
- 【bzoj1001】【BeiJing2006】【狼抓兔子】【网络流】【平面图转对偶图】
- [平面图转最短路]BZOJ1001:[BeiJing2006]狼抓兔子
- [BZOJ1001]Beijing2006 狼抓兔子|平面图转对偶图
- BZOJ1001 狼抓兔子 详解 (平面图 spfa)
- 【BZOJ1001】狼抓兔子(BJOI2006)-平面图最小割转最短路
- BZOJ1001 [BeiJing2006]狼抓兔子(网络流最小割)
- [BZOJ1001][BeiJing2006]狼抓兔子 && 平面网络流
- bzoj1001 狼抓兔子 网络流(水)
- bzoj1001(网络流,最小割)狼抓兔子
- BZOJ1001(狼抓兔子)
- 【BZOJ1001】狼抓兔子
- BZoj1001狼抓兔子
- 【bzoj1001】【狼抓兔子】
- BZOJ1001狼抓兔子
- [bzoj1001]狼抓兔子
- ST表
- java多线程(1)_正确使用Condition实现等待通知
- Struts2常用标签
- 【机器学习】--神经网络(NN)
- 【恍然大悟】【痛彻心扉】的领悟
- bzoj1001狼抓兔子——网络流平面图问题
- 洛谷P2617 Dynamic Ranking 树状数组套主席树
- FreeBASIC学习笔记——4.2 循环语句
- day06_schema
- Redis实战总结(三)
- php sdk 百度(API)智能语音识别
- c++中重载、隐藏和覆盖的区别
- 关于Google神牛Jeff Dean的笑话,非程序员勿入
- Hadoop3.0稳定版的安装部署