题目描述:

给定一个平面图,求最小割。

题解:

本题是一道经典题.

周冬Orz的论文是很好的研究资料。

这道题点太多,所以直接跑dinic无疑会超时。

我们观察原图,发现原图是一个平面图。

什么是平面图呢?平面图就是可以画在平面上,边没有交错的图。

平面图有几个很吼的性质:

  1. 欧拉定理(欧拉的定理真多。。):如果平面图把平面分为f个面,有n个点,m条边,那么我们有:

\[f = m - n + 2
\]

  1. 任何一个平面图的对偶图还是一个平面图。

这里的对偶图指的是把原图中的面当作点,边还是边进行构图得到的图。

我们很容易发现,对偶图中的一个环就是原图的一个最小割。

但是,显然我们求环还是比较麻烦的。

我们考察原图性质,

如果在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]狼抓兔子——最大流转最短路,平面图的更多相关文章

  1. BZOJ1001 BJOI2006 狼抓兔子

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

  2. BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)

    显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...

  3. 【BZOJ1001】狼抓兔子(网络流)

    [BZOJ1001]狼抓兔子(网络流) 题面 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨, ...

  4. P4001 [BJOI2006]狼抓兔子(对偶图)

    P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...

  5. 【BZOJ1001】狼抓兔子(平面图转对偶图,最短路)

    [BZOJ1001]狼抓兔子(平面图转对偶图,最短路) 题面 BZOJ 洛谷 题解 这题用最小割可以直接做 今天再学习了一下平面图转对偶图的做法 大致的思路如下: 1.将源点到汇点中再补一条不与任何线 ...

  6. BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*

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

  7. [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图

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

  8. [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 31805  Solved: 8494[Submit][ ...

  9. BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 19528  Solved: 4818[Submit][ ...

随机推荐

  1. zookeeper: web ui工具的安装

    zookeeper官方没有提供web用户界面,这使很多人在使用zookeeper(动物管理员)同时,并不是很容易的理解zookeeper的数据结构,还好淘宝有位大神用Nodejs写了一个web的ui工 ...

  2. HEXO next live2d插件删除问题

    title: HEXO next live2d插件删除问题 date: 2018-03-06 13:09:12 updated: tags: [hexo,next,建站,学习,前端技术,疑问] des ...

  3. Eclipse 创建 Java 类---Eclipse教程第10课

    打开新建 Java 类向导 你可以使用新建 Java 类向导来创建 Java 类,可以通过以下途径打开 Java 类向导: 点击 "File" 菜单并选择 New > Cla ...

  4. 什么是App加壳,以及App加壳的利与弊

    非著名程序员涩郎 非著名程序员,字耿左直右,号涩郎,爱搞机,爱编程,是爬行在移动互联网中的一名码匠!个人微信号:loonggg,微博:涩郎,专注于移动互联网的开发和研究,本号致力于分享IT技术和程序猿 ...

  5. IOS客户端的个人中心可以查看自己的博客了。

    IOS客户端的个人中心可以查看自己的博客了. 写这篇是为了在客户端显示之用. 下一步实现在客户端发博客.

  6. Lua语言中文手册 转载自网络

    Programming in LuaCopyright ® 2005, Translation Team, www.luachina.net Programming in LuaProgramming ...

  7. python学习笔记-基础

    1.大小写敏感 2. print (n,f,s1,s2,s3,s4,sep='\n')  -- 换行输出  seq='\n' print ('n=%d'%n,'f=%f'%f,'s1=%s'%s1,' ...

  8. Numpy 与 DataFrame对比与应用

    (一)对比Numpty 与 DataFrame默认索引取值不同点 Numpy索引取值 #Numpy索引取值 data=np.empty((2,4),dtype=int) print(data) ''' ...

  9. 爬虫:Scrapy16 - Spider Contracts

    Scrapy 通过合同(contract)的方式来提供了测试 spider 的集成方法. 可以硬编码(hardcode)一个样例(sample)url,设置多个条件来测试回调函数处理 response ...

  10. PPC Windows Mobile判断网络(gprs)连接与否代码

    转载 在PPC的开发中有时需要判断网络什么时候连接,什么时候断开,并且做出相应的处理.比如说TimeSyncPPC程序,就需要在网络连接之后得到消息然后去下载时间同步信息,因此就必须要一种方法让Tim ...