题意:


给一个如图形式的\(n*m\)的方格,从左上走到右下,给出边权,问分成两块所需的最小代价。\(n,m\leq1000\)。

思路:

显然是个最小割,但是\(O(n^2m)\)的复杂度很高,虽然这道题能过。
这里介绍一种最大流改最短路的方法——对偶图。
对任意一个图我们可以变成对偶图:
如下图,每一个闭合的平面我们都给他标号,然后连接源点和汇点,把外面那个无穷大的平面分成两个平面\(s,t\)。然后开始新建边。新建边的每一条边为:把一条原来边的左右两个平面连接到一起,权值为原来的边的权值。可以得出最后的新建的边的数量和原来一样。最后跑\(s,t\)的最短路即可得出原图的最大流。

代码:

#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <stack>
#include <ctime>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int maxn = 3e6 + 5;
const int MAXM = 3e6;
const ll MOD = 1e9 + 7;
const ull seed = 131;
const int INF = 0x3f3f3f3f;
struct Edge{int to, next;int w;
}edge[MAXM * 2];
struct qnode{int u;int c;qnode(int _u = 0, int _c = 0):u(_u), c(_c){}bool operator < (const qnode &r) const{return r.c < c;}
};
int tot, head[maxn], vis[maxn];
int dis[maxn];
void addEdge(int u, int v, int w){edge[tot].to = v;edge[tot].w = w;edge[tot].next = head[u];head[u] = tot++;
}
void Dijkstra(int n, int st){memset(vis, 0, sizeof(vis));for(int i = 0; i <= n; i++) dis[i] = INF;priority_queue<qnode> que;while(!que.empty()) que.pop();dis[st] = 0;que.push(qnode(st, 0));qnode temp;while(!que.empty()){temp = que.top();que.pop();int u = temp.u;if(vis[u]) continue;vis[u] = 1;for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;int w = edge[i].w;if(!vis[v] && dis[v] > dis[u] + w){dis[v] = dis[u] + w;que.push(qnode(v, dis[v]));}}}
}
int n, m;
int getupid(int x, int y){return (x - 1) * (m - 1) + y;
}
int getdownid(int x, int y){return (x - 1) * (m - 1) + y + (n - 1) * (m - 1);
}
int main(){memset(head, -1, sizeof(head));tot = 0;scanf("%d%d", &n, &m);if(n == 1 || m == 1){int ans = INF;if(n == m) ans = 0;if(n < m) swap(n, m);for(int i = 1; i <= n - 1; i++){int w;scanf("%d", &w);ans = min(ans, w);}printf("%d\n", ans);return 0;}int st = 0, en = (n - 1) * (m - 1) * 2 + 1;for(int i = 1; i <= n; i++){for(int j = 1; j <= m - 1; j++){int w;scanf("%d", &w);if(i == 1){addEdge(st, getupid(i, j), w);addEdge(getupid(i, j), st, w);}else if(i == n){addEdge(en, getdownid(i - 1, j), w);addEdge(getdownid(i - 1, j), en, w);}else{addEdge(getupid(i, j), getdownid(i - 1, j), w);addEdge(getdownid(i - 1, j), getupid(i, j), w);}}}for(int i = 1; i <= n - 1; i++){for(int j = 1; j <= m; j++){int w;scanf("%d", &w);if(j == 1){addEdge(getdownid(i, j), en, w);addEdge(en, getdownid(i, j), w);}else if(j == m){addEdge(getupid(i, j - 1), st, w);addEdge(st, getupid(i, j - 1), w);}else{addEdge(getdownid(i, j), getupid(i, j - 1), w);addEdge(getupid(i, j - 1), getdownid(i, j), w);}}}for(int i = 1; i <= n - 1; i++){for(int j = 1; j <= m - 1; j++){int w;scanf("%d", &w);addEdge(getupid(i, j), getdownid(i, j), w);addEdge(getdownid(i, j), getupid(i, j), w);}}Dijkstra(en, st);printf("%d\n", dis[en]);return 0;
}

转载于:https://www.cnblogs.com/KirinSB/p/11483826.html

BZOJ1001 狼抓兔子(网络流转最短路:对偶图)相关推荐

  1. BZOJ1001 狼抓兔子 终于过了!

    时间来不及了,先贴代码吧!有时间再写. 好苦逼啊,WA了若干次,还有一次RE,一次TLE. 虽然主要运用的算法和资料都由师兄提供了.还是太弱了,太天真了. 首先,数据范围就WA了,RE了,TLE了. ...

  2. [bzoj1001]狼抓兔子

    现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点 ...

  3. bzoj1001狼抓兔子

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

  4. 【BJOI2006】bzoj1001 狼抓兔子

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

  5. BZOJ1001 狼抓兔子

    最小割 代码 # include <bits/stdc++.h> # define IL inline # define RG register # define Fill(a, b) m ...

  6. 【BZOJ1001】狼抓兔子题解

    BZOJ1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还 ...

  7. 【BZOJ1001】狼抓兔子

    [BZOJ1001]狼抓兔子 题面 bzoj 题解 懒得平面图转对偶图了,直接最小割板子加优化. #include <iostream> #include <cstdio> # ...

  8. 【bzoj1001】【狼抓兔子】

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 12719 Solved: 3017 [Submit][ ...

  9. bzoj1001/BJOI2006 狼抓兔子

    1001: [BeiJing2006]狼抓兔子(传送门) 图论新知识..没学过.. 平面图最小割等于对偶图的最短路 详见课件:http://wenku.baidu.com/view/8f1fde586 ...

  10. P2030 - 【BJOI2006】狼抓兔子

    P2030 - [BJOI2006]狼抓兔子 Description 八中OJ上本题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001  现 ...

最新文章

  1. 查看器_三款完美替代Windows10自带照片查看器的神器!
  2. 码农也能有春天:一个人独立运营网站12年,赚到了5亿多美元!
  3. Atitit onvif协议获取rtsp地址播放java语言 attilx总结
  4. float gpu 加速_tensorflow - GPU 加速
  5. Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)(转载)
  6. java 发送cookie_Java如何在Servlet中发送cookie?
  7. 姜健:为开源工作幸福且自豪
  8. 十动然鱼!《闲鱼年会经济数据》来了:卖得最快的奖品还是它
  9. 单片机学校实训老师上课需要的工具以及源码分享
  10. JavaFx系列(二) Thread顯示進度窗的對話框
  11. Updatepanel jquery 失效解决方案
  12. android 渲染 控件,自定义控件被忽略的渲染性能
  13. Win10安装Eclipse以及可能出现的问题
  14. 国际版firefox安装方法
  15. 高德地图 热力图 清空地图
  16. 正则表达式判断手机号码运营商
  17. 推进智慧工地建设,智慧工地是什么?建筑工地人必看!
  18. python pyqt5 股票分时_pythonpyqt5股票分时:股票风险与提示_XAC配资之家
  19. 国家自然科学基金“十四五”优先发展领域!
  20. MYSQL数据库的数据存储文件

热门文章

  1. SQLServer之删除用户自定义数据库用户
  2. git 列出两个 commit 之间变更的文件列表
  3. Unity3d脚本生命周期
  4. bio、nio、aio及select、poll、epoll
  5. UNIX环境高级编程——记录上锁(fcntl函数)以及死锁检测
  6. [转]Python中RE模块的应用
  7. JS获取鼠标的坐标和滚动条的位置
  8. IDEA-Maven的Dependencies中出现红色波浪线
  9. 如何优雅的调用第三方接口
  10. 扎克伯格13年前写的Facebook网站代码,你见过吗?