_bzoj1001 [BeiJing2006]狼抓兔子【平面图】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1001

顺便推荐一个ppt,里面有对平面图的介绍:浅析最大最小定理在信息学竞赛中的应用。

这里直接求最小割肯定会T,所以应把原图看成一张平面图,ppt中说该平面图对应的对偶图的每一个环对应原图的一个割,这点有些不理解,不过不影响做这一道题。想象一下,在最外面那个无限大的平面,由左上角朝右下角连一条附加的边,这么做就多了一个附加面,设这条附加的边的权值为 -inf,那么最小割一定包含这一条边。把这条边去掉,就成了求一个最短路的问题了。

#include <cstdio>
#include <cstring>

const int maxn = 1005, maxnd = maxn * maxn << 1, maxe = maxn * maxn * 3;

int n, m, S, T, special = 2147483647, t1, t2, t3;
int head[maxnd], to[maxe << 1], next[maxe << 1], w[maxe << 1], lb;
char ch;
bool inq[maxnd];
int que[maxnd], h, head_, tail, d[maxnd];

inline void ist(int aa, int ss, int ww) {
	to[lb] = ss;
	next[lb] = head[aa];
	head[aa] = lb;
	w[lb] = ww;
	++lb;
}
inline void readint(int & rt) {
	while ((ch = getchar()) < 48);
	rt = ch - 48;
	while ((ch = getchar()) > 47) {
		rt = rt * 10 + ch - 48;
	}
}

int main(void) {
	//freopen("in.txt", "r", stdin);
	memset(head, -1, sizeof head);
	memset(next, -1, sizeof next);
	readint(n); readint(m);
	if (n == 1 || m == 1) {
		while (scanf("%d", &t1) != EOF) {
			special = special < t1? special: t1;
		}
		printf("%d\n", special);
		return 0;
	}
	S = (n - 1) * (m - 1) * 2 + 1;
	T = S + 1;
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j < m; ++j) {
			t2 = (i - 1) * (m - 1) * 2 + j * 2;
			t1 = t2 - (m - 1) * 2 - 1;
			t1 = t1 > 0? t1: T;
			t2 = t2 < S? t2: S;
			scanf("%d", &t3);
			ist(t1, t2, t3);
			ist(t2, t1, t3);
		}
	}
	for (int i = 1; i < n; ++i) {
		t2 = (i - 1) * (m - 1) * 2 + 1;
		scanf("%d", &t3);
		ist(S, t2, t3);
		ist(t2, S, t3);
		for (int j = 2; j < m; ++j) {
			t1 = (i - 1) * (m - 1) * 2 + (j - 1) * 2;
			t2 = t1 + 1;
			scanf("%d", &t3);
			ist(t1, t2, t3);
			ist(t2, t1, t3);
		}
		t1 = i * (m - 1) * 2;
		scanf("%d", &t3);
		ist(t1, T, t3);
		ist(T, t1, t3);
	}
	for (int i = 1; i < n; ++i) {
		for (int j = 1; j < m; ++j) {
			t2 = (i - 1) * (m - 1) * 2 + j * 2;
			t1 = t2 - 1;
			scanf("%d", &t3);
			ist(t1, t2, t3);
			ist(t2, t1, t3);
		}
	}

	memset(d, 0x3c, sizeof d);
	que[tail++] = S;
	inq[S] = true;
	d[S] = 0;
	while (head_ != tail) {
		h = que[head_++];
		if (head_ == T) {
			head_ = 0;
		}
		inq[h] = false;
		for (int j = head[h]; j != -1; j = next[j]) {
			if (d[to[j]] > d[h] + w[j]) {
				d[to[j]] = d[h] + w[j];
				if (!inq[to[j]]) {
					inq[to[j]] = true;
					que[tail++] = to[j];
					if (tail == T) {
						tail = 0;
					}
				}
			}
		}
	}
	printf("%d\n", d[T]);
	return 0;
}

  

时间: 2024-10-27 17:06:31

_bzoj1001 [BeiJing2006]狼抓兔子【平面图】的相关文章

BZOJ 1001 [BeiJing2006]狼抓兔子 平面图最大流

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) 道路上的权值表示这条路上最多能够通过的兔子数,道路是

bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割

平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割  找到最小环(即最短路)极为所求,注意辅助边的建立 加入读入优化  不过时间还是一般  估计是dij写的不好   大神勿喷~~~ /************************************************************** Problem: 1001 User: 96655 Language: C++ Result: Accepted Time:1724 ms Memory:95120 kb ****

bzoj1001 [BeiJing2006]狼抓兔子

1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 23723  Solved: 5981[Submit][Status][Discuss] Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M

BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】

1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 23822  Solved: 6012[Submit][Status][Discuss] Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M

BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)

平面图的最小割转化为对偶图的最短路(资料:两极相通——浅析最大最小定理在信息学竞赛中的应用) ,然后DIJKSTRA就OK了. ------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<que

BZOJ1001: [BeiJing2006]狼抓兔子【最短路】

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 27684  Solved: 7127 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的

【BZOJ】1001: [BeiJing2006]狼抓兔子

1001: [BeiJing2006]狼抓兔子 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)的窝中去,狼王开始伏击

1001: [BeiJing2006]狼抓兔子

1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 23595  Solved: 5940 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<

BZOJ 1001: [BeiJing2006]狼抓兔子 对偶图

本题是最大流转最小割转对偶图最短路 推荐周东的<浅析最大最小定理在信息学竞赛中的应用> 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 12166  Solved: 2866 [Submit][Status][Discuss] Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在