博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ1001】[BeiJing2006]狼抓兔子
阅读量:6251 次
发布时间:2019-06-22

本文共 2727 字,大约阅读时间需要 9 分钟。

挺简单一个题,最小割模板

我的感觉就是可能建图的时候会比较麻烦吧,毕竟三个方向。

#include 
#include
#include
#include
#include
#define debug(x) std::cout << #x << " = " << x << std::endl;#define __OPTIMIZED__INPUT__int nextInt(){ int num = 0; char c; bool flag = false; while ((c = std::getchar()) == ' ' || c == '\r' || c == '\n' || c == '\t'); if (c == '-') flag = true; else num = c - 48; while (std::isdigit(c = std::getchar())) num = num * 10 + c - 48; return (flag ? - 1 : 1) * num;}struct{ int to; int nex; int v;} e[600001];int head[600001];int h[600001], q[600001];int ans, n, m;void Insert(const int u, const int v, const int w){ static int tot = 0; tot++; e[tot].to = v; e[tot].v = w; e[tot].nex = head[u]; head[u] = tot;}bool bfs(){ int now, i; std::memset(h, 0xff, sizeof h); int t = 0; int w = 1; q[t] = 1; h[1] = 0; while (t < w) { now = q[t]; t++; i = head[now]; for (int i = head[now]; i; i = e[i].nex) if (e[i].v && h[e[i].to] < 0) { q[w++] = e[i].to; h[e[i].to] = h[now] + 1; } } if (h[n * m] == -1) return 0; return 1;}int dfs(const int x, const int f){ if (x == n * m) return f; int w, used = 0; for (int i = head[x]; i; i = e[i].nex) if (e[i].v && h[e[i].to] == h[x] + 1) { w = dfs(e[i].to, std::min(w, e[i].v)); e[i].v -= w; e[i + 1].v += w; used += w; if (used == f) return f; } if (!used) h[x] = -1;// debug(used); return used;}void Dinic(){ while (bfs()) ans += dfs(1, INT_MAX);}int main(int argc, char ** argv){ n = nextInt(); m = nextInt(); int x; for (int i = 1; i <= n; i++) for (int j = 1; j < m; j++) { x = nextInt(); Insert(m * (i - 1) + j, m * (i - 1) + j + 1, x); Insert(m * (i - 1) + j + 1, m * (i - 1) + j, x); } for (int i = 1; i < n; i++) for (int j = 1; j <= m; j++) { x = nextInt(); Insert(m * (i - 1) + j, m * i + j, x); Insert(m * i + j, m * (i - 1) + j, x); } for (int i = 1; i < n; i++) for (int j = 1; j < m; j++) { x = nextInt(); Insert(m * (i - 1) + j, m * i + j + 1, x); Insert(m * i + j + 1, m * (i - 1) + j, x); } Dinic(); std::cout << ans/* << std::endl*/;#ifdef __NOTEPADPP std::cin.get(); std::cin.get();#endif return 0;}

转载于:https://www.cnblogs.com/edwardtsui/p/6782858.html

你可能感兴趣的文章
练习PYTHON之GEVENT
查看>>
Web持久化存储Web SQL、Local Storage、Cookies(常用)
查看>>
node js 常用模块
查看>>
Libsvm和Liblinear的使用经验谈
查看>>
php生成curl命令行
查看>>
PHP中的数据库四、mongodb
查看>>
品读吴军"之"系列
查看>>
框架学习笔记:Unity3D的MVC框架——StrangeIoC
查看>>
Android NumberPicker 修改分割线颜色和高度及字体颜色大小
查看>>
树莓派键盘布局修正
查看>>
Android之Http通信——3.Android HTTP请求方式:HttpURLConnection
查看>>
hdu 5071 Chat(模拟)
查看>>
【转】 测试人员的职业规划 --整理标注
查看>>
C++智能指针--weak_ptr
查看>>
struts2的坑以及tomcat的一些常识
查看>>
HDURevenge of Segment Tree(第二长的递增子序列)
查看>>
Json数组操作小记 及 JSON对象和字符串之间的相互转换
查看>>
Linux服务器时间相关命令记录
查看>>
常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服...
查看>>
视频支持拖动进度条播放的实现(基于nginx)
查看>>