【bzoj1001】【最短路】【对偶图】【最大流转最小割】狼抓兔子题解
【BZOJ1001】狼抓兔子
1001: [BeiJing2006]狼抓兔子
Time Limit: 15 Sec Memory Limit: 162 MB
Submit: 18872 Solved: 4647
[Submit][Status][Discuss]
Description

Input
Output
输出一个整数,表示参与伏击的狼的最小数量.
Sample Input
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
题目大意:如和将一张无向图割成完全不相连的两部分,并使被割的边总权值最小。
题解:刚看这道题的时候满脑子暴力,直到某大佬让我去学学对偶图然后给我说这是最短路问题后,才渐渐开始有了思路。在进入正题前我们得先了解对偶图是啥。
维基百科对对偶图(Dual Graph)的解释如下:
“In the mathematical discipline of graph theory, the dual graph of a plane graph G is a graph that has a vertex for each face of G. The dual graph has an edge whenever two faces of G are separated from each other by an edge, and a self-loop when the same face appears on both sides of an edge. Thus, each edge e of G has a corresponding dual edge, whose endpoints are the dual vertices corresponding to the faces on either side of e. The definition of the dual depends on the choice of embedding of the graph G, so it is a property of plane graphs (graphs that are already embedded in the plane) rather than planar graphs (graphs that may be embedded but for which the embedding is not yet known).”
根据维基百科的解释,对偶图中的每一个点即为平面图中的某一个面,对偶图中任意两点间的线都是平面图中对应两平面公共边的割线,如果平面图中某一条边只属于一个面,那么在对偶图中就是一个环边,注意平面图周围无边界的面也是对偶图中的一个点。
首先这是一个普通的平面图:

此平面图对应的对偶图即为:

如图所示,对偶图的边数等于平面图的边数,对偶图的点数等于平面图的面数。
那么对偶图和这道题又有什么关系呢?
首先我们把起点和终点不与其他边交叉地连接起来构成一个新面,然后做出这个新平面图的对偶图,把对偶图中新面的点和无边界面的点之间的连线删去,求新面的点到无边界面的点的最短路即可(注意割线的权值即为被割边的权值)。这样求得的最短路就是原平面图的最小割。如下图所示(图源自网络):
这样我们就可以将最大流问题转化为一个最小割问题,也就可以当成是最短路问题了。所以到这里这道题唯一的难点就在输入时处理平面图和对偶图并加边上了,用数学推导推导就好了,这里不再赘述。
下面贴AC代码:
#include <cstdio>
int N,M,cnt,end_pos,minn=1e9,star,ass,t;
int pre[],dist[],quq[];//bzoj数据有毒,随意开上几百万别MLE了就行
bool vis[];//最好别用int存,有可能超内存或者开内存的时候超时什么的
struct pack {int to,next,len;} E[];
void add_edge(int x,int y,int v){
E[++cnt].to=x;E[cnt].next=pre[y];E[cnt].len=v;pre[y]=cnt;
E[++cnt].to=y;E[cnt].next=pre[x];E[cnt].len=v;pre[x]=cnt;
}
int spfa(){
while (star<=ass)
{
int x=quq[star];
vis[quq[star++]]=false;
for (int i=pre[x];i!=;i=E[i].next)
{
int y=E[i].to;
if (dist[y]>dist[x]+E[i].len)
{
dist[y]=dist[x]+E[i].len;
if (vis[y]==false)
{
quq[++ass]=y;
vis[y]=true;
}
}
}
}
}
void input_adt(){
scanf("%d%d",&N,&M); end_pos=*(N-)*(M-)+;
if(N==){
for(int i=;i<M;++i){
scanf("%d",&t);
if(t<minn) minn=t;
}
return ;
}
else if(M==){
for(int i=;i<N;++i){
scanf("%d",&t);
if(t<minn) minn=t;
}
return ;
} for(int i=;i<=end_pos;++i) dist[i]=1e9; for(int i=;i<=*(N-)+;i+=)
for(int j=;j<M;++j){
scanf("%d",&t);
/* if(N==1){
if(t<minn) minn=t;
}*/
if(i==) add_edge(j,,t);
else if(i==*(N-)+) add_edge(end_pos-(M-j),end_pos,t);
else add_edge((i-)*(M-)+j,(i-)*(M-)+j,t);
}
// if(minn!=1e9) return ; for(int i=;i<*(N-)+;i+=)
for(int j=;j<=M;++j){
scanf("%d",&t);
/* if(M==1){
if(t<minn) minn=t;
}*/
if(j==) add_edge(i*(M-)+,end_pos,t);
else if(j==M) add_edge(i*(M-),,t);
else add_edge(i*(M-)+j,(i-)*(M-)+j-,t);
}
// if(minn!=1e9) return ; for(int i=;i<*(N-)+;i+=)
for(int j=;j<M;++j){
scanf("%d",&t);
add_edge((i-)*(M-)+j,i*(M-)+j,t);
}
}
int main(){
input_adt();
if(minn==1e9){
spfa();
printf("%d",dist[end_pos]);
}
else printf("%d",minn);
return ;
}
【bzoj1001】【最短路】【对偶图】【最大流转最小割】狼抓兔子题解的更多相关文章
- BZOJ1001 狼抓兔子 题解
裸的最小割,转化成最大流即可. #include <bits/stdc++.h> int n,m; int S,T; int mincost; int head[6001000],tot= ...
- BZOJ1001 洛谷4001 [BJOI2006]狼抓兔子 题解
题目 这个题目有多种解法,这个题也是一个比较经典的题了,正是因为他的多样的做法,这个题主要难在建图和优化,因为这是一个网格图,所以spfa肯定过不去,所以用最短路解法的话,只能用dij,而网络流也是要 ...
- [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 31805 Solved: 8494[Submit][ ...
- BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)
显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...
- [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图
狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 19528 Solved: 4818[Submit][ ...
- BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...
- BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec ...
- BZOJ1001 狼抓兔子 平面图转对偶图 最小割
现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为 ...
随机推荐
- Abstract Factory 抽象工厂(创建型模式)
1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...
- U-Net卷积神经网络
由于项目需要,用U-NET跑一个程序来对医学影像进行分割(segmentation),因此跑去看了下这篇论文(paper),下面会介绍一下U-Net的框架及要点,如果哪里有写的不对的,或者好的建议,欢 ...
- HDU 4725 The Shortest Path in Nya Graph( 建图 + 最短路 )
主要是建图,建好图之后跑一边dijkstra即可. 一共3N个点,1~N是原图中的点1~N,然后把每层x拆成两个点(N+x)[用于连指向x层的边]和(N+N+x)[用于连从x层指出的边]. 相邻层节点 ...
- hadoop2.6.4【windows7】构建maven项目 系列2
准备windows版本的hadoop2.6.4 下载windows版本的hadoop2.6.4解压在本地 新建maven项目构建hadoop依赖 <?xml version="1.0& ...
- ES6 Destructuring Assignment All In One
ES6 Destructuring Assignment All In One ES6 & Destructuring Assignment Axios, vue https://develo ...
- 【GXZ的原创】平衡树性能测试
本文作者为 GXZlegend ,转载请注明 出处 ,谢谢! 〇.序言 前些日子闲的蛋疼做了个平衡树性能测试... 主要是因为学会的平衡树越来越多,做题时却不知道写哪个... 本想结合效率和代码复杂度 ...
- Spring Boot RabbitMQ 延迟消息实现完整版
概述 曾经去网易面试的时候,面试官问了我一个问题,说 下完订单后,如果用户未支付,需要取消订单,可以怎么做 我当时的回答是,用定时任务扫描DB表即可.面试官不是很满意,提出: 用定时任务无法做到准实时 ...
- TCP面试题之滑动窗口原理
TCP 滑动窗口 作用: 1. 提供TCP可靠性:对发送的数据进行确认 2. 流量控制:窗口大小随链路变化 一.TCP窗口机制 TCP中窗口大小是指tcp协议一次传输多少个数据.因为TCP是一个面向连 ...
- mac平台打造犀利的Android Studio开发环境
0x0 背景介绍 随着Android Studio功能越来越强大,Android平台的开发者们基本上都从原来的Eclipse + ADT 转到了AS上.本文就记录自己在配置AS环境过程中遇到的各种问 ...
- shell-总结【摘录】
阅读目录 1. Shell简介 2. 几种常见的Shell 3. 编译型语言和解释型语言的区别 4. 什么时候使用Shell? 5. 第一个Shell脚本 6. Shell变量 7.Shell特殊变量 ...