[bzoj1001][BJOI2006]狼抓兔子——最大流转最短路,平面图
题目描述:
给定一个平面图,求最小割。
题解:
本题是一道经典题.
周冬Orz的论文是很好的研究资料。
这道题点太多,所以直接跑dinic无疑会超时。
我们观察原图,发现原图是一个平面图。
什么是平面图呢?平面图就是可以画在平面上,边没有交错的图。
平面图有几个很吼的性质:
- 欧拉定理(欧拉的定理真多。。):如果平面图把平面分为f个面,有n个点,m条边,那么我们有:
\]
- 任何一个平面图的对偶图还是一个平面图。
这里的对偶图指的是把原图中的面当作点,边还是边进行构图得到的图。
我们很容易发现,对偶图中的一个环就是原图的一个最小割。
但是,显然我们求环还是比较麻烦的。
我们考察原图性质,
如果在st中间连一条新边,显然新图还是平面图,同时会比原图多出一个面,我们称之为副面,
对于这个新图,我们构对偶图,同时令副面和最大的面一个为起点,一个为终点,显然对偶图中的最短路就是原图的一个最小割。
然后spfa解决就好辣。
本题最恶心的点在于建对偶图。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = (1000 * 1000 + 50) * 2;
int n, m, nm, s, t;
int dist[maxn];
struct edge {
int to, weigh;
};
vector<edge> G[maxn];
void add_edge(int from, int to, int weigh) {
G[from].push_back((edge){to, weigh});
G[to].push_back((edge){from, weigh});
}
void spfa() {
queue<int> q;
memset(dist, 127, sizeof(dist));
dist[s] = 0;
q.push(s);
int inq[maxn];
memset(inq, 0, sizeof(inq));
inq[s] = 1;
while (!q.empty()) {
int u = q.front();
q.pop();
inq[u] = 0;
for (int i = 0; i < G[u].size(); i++) {
edge &e = G[u][i];
if (dist[e.to] > dist[u] + e.weigh) {
dist[e.to] = dist[u] + e.weigh;
if (inq[e.to] == 0) {
q.push(e.to);
inq[e.to] = 1;
}
}
}
}
}
int main() {
scanf("%d%d", &n, &m);
nm = (n * m - m - n + 1) << 1;
s = 0, t = nm + 1;
//横向边
int x;
for (int j = 1; j < m; j++) {
scanf("%d", &x);
add_edge(j, t, x);
}
for (int i = 1; i < (n - 1); i++) {
for (int j = 1; j < m; j++) {
scanf("%d", &x);
add_edge((i << 1) * (m - 1) + j, ((i << 1) - 1) * (m - 1) + j, x);
}
}
for (int j = 1; j < m; j++) {
scanf("%d", &x);
add_edge(((n << 1) - 3) * (m - 1) + j, 0, x);
}
//纵向边
for (int i = 0; i < n - 1; i++) {
for (int j = 1; j <= m; j++) {
scanf("%d", &x);
if (j == 1)
add_edge(0, (i << 1) * (m - 1) + m, x);
else if (j == m)
add_edge((i << 1 | 1) * (m - 1), t, x);
else
add_edge((i << 1) * (m - 1) + j - 1, (i << 1) * (m - 1) + j + m - 1, x);
}
}
//斜
for (int i = 0; i < n - 1; i++) {
for (int j = 1; j < m; j++) {
scanf("%d", &x);
add_edge((i << 1 | 1) * (m - 1) + j, (i << 1) * (m - 1) + j, x);
}
}
spfa();
printf("%d", dist[t]);
}
[bzoj1001][BJOI2006]狼抓兔子——最大流转最短路,平面图的更多相关文章
- BZOJ1001 BJOI2006 狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)
显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...
- 【BZOJ1001】狼抓兔子(网络流)
[BZOJ1001]狼抓兔子(网络流) 题面 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨, ...
- P4001 [BJOI2006]狼抓兔子(对偶图)
P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...
- 【BZOJ1001】狼抓兔子(平面图转对偶图,最短路)
[BZOJ1001]狼抓兔子(平面图转对偶图,最短路) 题面 BZOJ 洛谷 题解 这题用最小割可以直接做 今天再学习了一下平面图转对偶图的做法 大致的思路如下: 1.将源点到汇点中再补一条不与任何线 ...
- BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*
BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...
- [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图
狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 31805 Solved: 8494[Submit][ ...
- BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 19528 Solved: 4818[Submit][ ...
随机推荐
- Windows手工创建服务方法
需要将程序设置成Windows服务的情况,可以利用一下windows自带的sc命令来创建服务. 该命令的基本用法如下:打开cmd命令, 输入如下信息:1 创建服务:sc create SecServe ...
- POJ:3259-Wormholes(最短路判断负环)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 58153 Accepted: 21747 Descripti ...
- python向多个邮箱发邮件--注意接收是垃圾邮件
群发邮件注意:三处标红的地方 # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from emai ...
- 关于学习less后一些感悟
学习了一天的less发现,自己被自己弄的晕头转向,好在是学明白了! 一.写自己的第一个less css样式编程: 网址:http://www.1024i.com/demo/less/document. ...
- Android stadio 工具使用
android staido 有logcat窗口,她可以显示log信息.还有run窗口. 我以前一直忽略了run窗口,其实蛮重要,蛮好用的.他只会显示你当前运行的进程的log,不用你再去设置filld ...
- Github前端项目排名
Github前端项目排名(2016-04-04) 一.前言 近几年前端技术日新月异,从 RequireJS 到 AngularJS 再到 React,似乎每天都有新的技术诞生.而大神们总能第一时间 ...
- 三层还是DDD,ORM还是Ado.Net,何去何从?
我本想把这个问题放到博问去,前几次有去博问问过之类的问题,无奈大神们可能都不屑回答别人的低级问题.所以放到随笔里,一方面把自己对ORM.架构的一些看法写下来抛砖引玉,另一方面最主要的是想寻求大神们指指 ...
- 使用自己的类来作为hashtable的主键
import java.util.*; class Counter { } class Groundhog2 { int ghNumber; Groundhog2(int n) { ghNumber ...
- Pascal “内存病毒”(骗人的)
Pascal内存病毒 Chaobs从互联网上获得 pascal病毒虽然说只用Ctrl+Pause Break就可以关闭,但是像有些程序一旦启动,不用等你找到那两个键,就自己运行结束关闭了.比如下面一个 ...
- 【ZigZag Conversion】cpp
题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...