BZOJ 1001 狼抓兔子 【平面最小割转最短路】
2018-03-04 15:02
295 查看
传送门
这道题是很明显的平面最小割转最短路的题, 就是建图方法有很多种, 我写的是1 2 3 ….. 按行下去的, 死活过不了, 本地找AC代码对拍完全没问题, 然后我就被卡了一下午, 是在不行找题解复制了一个建图方法就过了…. 可以只是数字的不同这不会有影响吧? 总之这道题真的非常坑, 还要特判n == 1 || m == 1的情况, 最重要的还是思想, 可是我能看过来用这种算法做, 但是我每次做这种题我的建图方法都过不了, 真的很绝望啊!!!
AC Code
这道题是很明显的平面最小割转最短路的题, 就是建图方法有很多种, 我写的是1 2 3 ….. 按行下去的, 死活过不了, 本地找AC代码对拍完全没问题, 然后我就被卡了一下午, 是在不行找题解复制了一个建图方法就过了…. 可以只是数字的不同这不会有影响吧? 总之这道题真的非常坑, 还要特判n == 1 || m == 1的情况, 最重要的还是思想, 可是我能看过来用这种算法做, 但是我每次做这种题我的建图方法都过不了, 真的很绝望啊!!!
AC Code
const int maxn = 2e6+5; int n, m; struct node { int to, next, w; bool operator < (const node& a) const { return w > a.w; } } e[maxn*4]; int cnt, head[maxn]; void add(int u, int v, int w) { e[cnt] = node{v, head[u], w}; head[u] = cnt++; } void init() { cnt = 0; Fill(head, -1); } bool vis[maxn]; int dis[maxn]; void dij(int st,int ed) { priority_queue<node> q; Fill(dis,inf); Fill(vis,0); dis[st] = 0; q.push(node{st, 0, 0}); while (!q.empty()) { node u = q.top(); q.pop(); if(vis[u.to]) continue; vis[u.to] = 1; for (int i = head[u.to]; ~i; i = e[i].next) { int to = e[i].to; if (dis[to] > dis[u.to] + e[i].w) { dis[to] = dis[u.to] + e[i].w; q.push(node{to, 0, dis[to]}); } } } cout << dis[ed] << endl; } void solve() { while(~scanf("%d%d", &n, &m)) { if (n == 1 || m == 1) { int ans = inf; if (m < n) swap(n, m); for (int i = 1 ; i <= m-1 ; i ++) { int x; scanf("%d", &x); ans = min(ans, x); } printf("%d\n", ans == inf ? 0 : ans); continue; } init(); int s = 0, t = (n-1)*(m-1)*2+1; int u, v, w; for (int i = 1 ; i <= n ; i ++){ u = (i-1)*(m-1)*2; for (int j = 1 ; j < m ; j ++) { u += 2; v = u-2*m+1; scanf("%d", &w); if (i == 1) add(0, u, w); else if (i == n) add(v, t, w); else { add(u,v,w); add(v,u,w); } } } for (int i = 1 ; i < n ; i ++) { u = (i-1)*(m-1)*2+1; for (int j = 1 ; j <= m ; j ++) { scanf("%d", &w); if (j == 1) add(u, t, w); else if (j == m) add(0, u-1, w); else { add(u, u-1, w); add(u-1, u, w); } u+=2; } } for (int i = 1 ; i < n ; i ++){ u = (i-1)*(m-1)*2+1; for (int j = 1 ; j < m ; j ++) { scanf("%d", &w); add(u, u+1, w); add(u+1, u, w); u += 2; } } dij(s, t); } }
相关文章推荐
- 狼抓兔子 BZOJ1001 平面图最小割转对偶图最短路
- BZOJ 1001[BeiJing2006]狼抓兔子 最小割转最短路
- BZOJ 1001: [BeiJing2006]狼抓兔子(平面图最小割转对偶图最短路)
- 【BZOJ1001】【Beijing2006】狼抓兔子(平面图转对偶图:最小割+最短路)
- BZOJ1001 [BeiJing2006]狼抓兔子(平面图最小割转最短路)
- 【BZOJ1001】狼抓兔子(BJOI2006)-平面图最小割转最短路
- 【平面图】【最小割】【最短路】【Heap-Dijkstra】bzoj1001 [BeiJing2006]狼抓兔子
- 【bzoj1001】【最短路】【对偶图】【最大流转最小割】狼抓兔子题解
- 【BZOJ1001】狼抓兔子(平面图最小割转最短路)
- [最小割+对偶建图+最短路] BZOJ1001: [BeiJing2006]狼抓兔子
- BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)
- bzoj1001 [BeiJing2006]狼抓兔子(最小割/平面图最大流转对偶图最短路)
- 【BZOJ1001】狼抓兔子(平面图转对偶图,最短路,最小割)
- 平面圖最小割 BZOJ1001: [BeiJing2006]狼抓兔子 BZOJ 2007: [Noi2010]海拔
- 【BZOJ 1001】狼抓兔子 【S-T平面图最大流转对偶图最短路】
- BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)
- BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)
- [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)
- BZOJ 1001 狼抓兔子 [最小割转最短路=平面图转对偶图]
- 【最小割+对偶图=最短路】BZOJ1001 [BeiJing2006]狼抓兔子