BZOJ-1001 [BeiJing2006]狼抓兔子

原创 2016年08月31日 15:28:45

解题思路:

这道题目是关于最小割的一道题目。

最小割的经典算法是根据最大流最小割定理,将最小割化成最大流然后用dinic算法求解

不过这题比较特殊,即使转换成最大流求最小割依旧不可能通过。因为时间和空间的双重限制,所以这道题的解法需要利用这个图的特殊性质。

给出的图是一个平面图无疑,那么利用平面图的特殊性质解决这个问题会简单很多。

将平面图转换成其对偶图,然后计算新的源点到新的汇点的最短路径即可得出结果。

然后关于这个题目,有一篇资料写的很好推荐一发:传送门

听说这题用dijkstra+heap速度更快。

代码:

#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef struct node {
	int v, cap, nxt;
	node(int a = 0, int b = 0, int c = 0) {
		v = a; cap = b; nxt = c;
	}
}Edge;

const int maxn = 2100005;
const int maxm = 6100005;
const int inf = 0x3f3f3f3f;

Edge edge[maxm];
int tot, head[maxn];
int vis[maxn], dis[maxn];

void add(int u, int v, int cap) {
	edge[tot] = Edge(v, cap, head[u]);
	head[u] = tot++;
	edge[tot] = Edge(u, cap, head[v]);
	head[v] = tot++;
}
int spfa(int s, int t) {
	int x;
	Edge e;
	queue<int> q;
	while (!q.empty()) q.pop();
	memset(vis, 0, sizeof(vis));
	memset(dis, 0x3f, sizeof(dis));
	
	dis[s] = 0; vis[s] = 1; q.push(s);
	while (!q.empty()) {
		x = q.front(); q.pop(); vis[x] = 0;
		for (int i = head[x]; ~i; i = edge[i].nxt) {
			e = edge[i];
			if (dis[x] + e.cap < dis[e.v]) {
				dis[e.v] = dis[x] + e.cap;
				if (!vis[e.v]) {
					vis[e.v] = 1;
					q.push(e.v);
				}
			}
		}
	}
	return dis[t];
}
int main() {
	int n, m, u, v, cap;
	while (~scanf("%d%d", &n, &m)) {
		if (n == 1 || m == 1) {
			if (n > m) swap(n, m);
			int ans = inf;
			for (int i = 1, a; i < m; ++i) {
				scanf("%d", &a);
				ans = min(ans, a);
			}
			printf("%d\n", ans == inf ? 0 : ans);
			continue;
		}
		int s = 0, t = (m - 1) * 2 * (n - 1) + 1;
		tot = 0;
		memset(head, -1, sizeof(head));
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= m - 1; ++j) {
				scanf("%d", &cap);
				if (i == 1) { u = s; v = 2 * j; }
				else if (i == n) { u = (m - 1) * (n - 2) * 2 + 2 * j - 1; v = t; }
				else { v = (m - 1) * 2 * (i - 2) + 2 * j - 1; u = (m - 1) * 2 * (i - 1) + 2 * j; }
				add(u, v, cap);
				//printf("u = %d, v = %d, cap = %d\n", u, v, cap);
			}
		}
		for (int i = 1; i < n; ++i) {
			for (int j = 1; j <= m; ++j) {
				scanf("%d", &cap);
				if (j == 1) { v = t; u = (m - 1)*(i - 1) * 2 + 1; }
				else if (j == m) { u = s; v = (m - 1) * i * 2; }
				else { u = (m - 1) * (i - 1) * 2 + 2 * (j - 1); v = u + 1; }
				add(u, v, cap);
				//printf("u = %d, v = %d, cap = %d\n", u, v, cap);
			}
		}
		for (int i = 1; i < n; ++i) {
			for (int j = 1; j < m; ++j) {
				scanf("%d", &cap);
				u = (m - 1) * 2 * (i - 1) + 2 * j - 1; 
				v = u + 1;
				add(u, v, cap);
				//printf("u = %d, v = %d, cap = %d\n", u, v, cap);
			}
		}
		printf("%d\n", spfa(s, t));
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

BZOJ1001: [BeiJing2006]狼抓兔子

BZOJ 1001
  • qazw2424
  • qazw2424
  • 2016年07月23日 18:48
  • 423

BZOJ1001: [BeiJing2006]狼抓兔子 (最小割)

传送门 题目大意:求给出图的最小割(……题目就是这个意思)。 明眼一看,这就是一个裸的最大流,可是被数据范围吓住了,有10610^6个点,然后又有3∗1063*10^6条边,对于网络流可怜的O(n...
  • geng4512
  • geng4512
  • 2015年11月15日 13:06
  • 1572

bzoj 1001: [BeiJing2006]狼抓兔子(s-t平面图求最大流)

题目链接 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 20242  Solved: 5037 [...
  • fouzhe
  • fouzhe
  • 2017年01月22日 10:50
  • 282

【BJOI2006】狼抓兔子

【BJOI2006】狼抓兔子 【题目描述】 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一...
  • u013554919
  • u013554919
  • 2014年03月21日 19:39
  • 593

bzoj-1001 狼抓兔子

题意: 给出一个n*m的下面这样的图,求此图的最小割; n,m 题解: 这题说好的简单题结果怎么如此丧病; 最简单的想法就是求最小割就是求最小割嘛; 然后一发Dinic搞定...
  • ww140142
  • ww140142
  • 2015年08月12日 15:38
  • 749

bzoj1001/BJOI2006 狼抓兔子

1001: [BeiJing2006]狼抓兔子 图论新知识。。没学过。。 平面图最小割等于对偶图的最短路 详见课件:http://wenku.baidu.com/view/8f1fde586edb6...
  • Lytning
  • Lytning
  • 2014年05月06日 21:42
  • 2189

[BeiJing2006]狼抓兔子

Time Limit: 15 Sec  Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在...
  • JokerPoker
  • JokerPoker
  • 2014年12月29日 08:20
  • 123

BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA

1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Sub...
  • DaD3zZ
  • DaD3zZ
  • 2015年12月19日 17:35
  • 389

【BJOI2006】bzoj1001 狼抓兔子

最小割转最短路
  • sdfzyhx
  • sdfzyhx
  • 2016年12月14日 22:32
  • 174

【BZOJ1001】狼抓兔子题解

BZOJ1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有...
  • ff88655068
  • ff88655068
  • 2014年08月27日 22:03
  • 769
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BZOJ-1001 [BeiJing2006]狼抓兔子
举报原因:
原因补充:

(最多只允许输入30个字)