【BZOJ 1001】狼抓兔子 对偶图+SPFA
这道题是求图的最小割,也就是用最大流。但因为边太多,最大流算法会T,因此不能用最大流算法。
因为这是个平面图,所以求平面图的最小割可以使用特殊的技巧就是求对偶图然后求对偶图的最短路。把每个面看成一个点f*,f*之间边的权值就是之前原来的点f之间与f*的边交叉的边的权值。(说的不清楚,大家可以看其他博客,讲得都很好)
这样建了一个对偶图G*,由此可见,对偶图G*的一条路对应着原图G的一个割。所以求G*的最短路就相当于求G的最小割。
以后遇到平面图求最小割就把它转化成对偶图再求最短路,这样时间效率会大大提高。
| 88732 kb | 3572 ms | C++/Edit | 2195 B |
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int point[],next[],v[],c[];
int cnt=,s,t,n,m,dist[];
bool vis[];
queue<int>q;
void insect(int x,int y,int z)
{cnt++;next[cnt]=point[x];point[x]=cnt;v[cnt]=y;c[cnt]=z;}
void in1()
{
int i,j,num;
for (j=;j<m;++j)
{
scanf("%d",&num);
insect(j*,t,num);
insect(t,j*,num);
}
for (i=;i<n;++i)
for (j=;j<m;++j)
{
scanf("%d",&num);
insect((i-)*(m-)*+j*,(i-)*(m-)*+j*-m*+,num);
insect((i-)*(m-)*+j*-m*+,(i-)*(m-)*+j*,num);
}
for (j=;j<m;++j)
{
scanf("%d",&num);
insect(s,(n-)**(m-)+j*-,num);
insect((n-)**(m-)+j*-,s,num);
}
}
void in2()
{
int i,j,num,xx;
for (i=;i<n;++i)
{
scanf("%d",&num); xx=(i-)*(m-)*+;
insect(s,xx,num);
insect(xx,s,num);
for (j=;j<m;++j)
{
scanf("%d",&num); xx+=;
insect(xx-,xx,num);
insect(xx,xx-,num);
}
scanf("%d",&num);
insect(xx+,t,num);
insect(t,xx+,num);
}
}
void in3()
{
int i,j,num;
for (i=;i<n;++i)
for (j=;j<m;++j)
{
scanf("%d",&num);
insect((i-)*(m-)*+j*-,(i-)*(m-)*+j*,num);
insect((i-)*(m-)*+j*,(i-)*(m-)*+j*-,num);
}
}
void init()
{
scanf("%d %d\n",&n,&m);
s=; t=(n-)*(m-)*+;
in1();
in2();
in3();
}
void spfa()
{
int num,mp;
dist[s]=;
q.push(s);
while (!q.empty())
{
num=q.front(); q.pop(); vis[num]=;
mp=point[num];
while (mp>)
{
if (dist[v[mp]]>dist[num]+c[mp])
{
dist[v[mp]]=dist[num]+c[mp];
if (vis[v[mp]]==)
{
vis[v[mp]]=; q.push(v[mp]);
}
}
mp=next[mp];
}
}
printf("%d\n",dist[t]);
}
int main()
{
memset(dist,,sizeof(dist));
memset(point,,sizeof(point));
memset(next,,sizeof(next));
memset(vis,,sizeof(vis));
memset(v,,sizeof(v));
init();
spfa();
return ;
}


【BZOJ 1001】狼抓兔子 对偶图+SPFA的更多相关文章
- BZOJ 1001 狼抓兔子 (最小割转化成最短路)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 27715 Solved: 7134[Submit][ ...
- BZOJ 1001 - 狼抓兔子 - [Dinic最大流][对偶图最短路]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 Description现在小朋友们最喜欢的"喜羊羊与灰太狼", ...
- bzoj 1001狼抓兔子(对偶图+最短路)最大流
推荐文章:<浅析最大最小定理在信息学竞赛中的应用>--周冬 题目 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 算法讨论: 1.可以用最大流做,最大流等于最小割. 2.可以把这个图转化其对偶图,然 ...
- BZOJ 1001 狼抓兔子 平面图的最小割
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1001 题目大意: 见链接 思路: 求最小割,平面图的最小割等价于对偶图的最短路 直接建 ...
- bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...
- BZOJ 1001 狼抓兔子
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子 ...
- bzoj1001狼抓兔子 对偶图优化
bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...
- 【Bzoj】1001狼抓兔子(平面图最小割转对偶图最短路)
YEAH 题目链接 终于做对这道题啦 建图的艰辛难以言表- - 顺便说一句我队列转STL啦 狼抓兔子的地图符合平面图定义,于是将该图转成对偶图并求出对偶图的最短路即可. 这篇博客给了我极大的帮助 ...
随机推荐
- HDU 4819 Mosaic --二维线段树(树套树)
题意: 给一个矩阵,每次查询一个子矩阵内的最大最小值,然后更新子矩阵中心点为(Max+Min)/2. 解法: 由于是矩阵,且要求区间最大最小和更新单点,很容易想到二维的线段树,可是因为之前没写过二维的 ...
- 第13章 Windows内存体系结构
13.1 Windows的虚拟地址空间安排 13.1.1虚拟地址空间的分区(即虚拟地址空间布局) 进程的地址空间划分 分区 x86 32位 Windows 3GB用户模式下的x86 32位Window ...
- Unity抗锯齿
Unity抗锯齿设置是针对模型,对模型的阴影的锯齿设置无效,不知道我这样的理解是否正确. 遇到的问题 而我是要对灯光照射在模型上产生的阴影进行抗锯齿,暂时还未研究出解决方案,希望知道的朋友告知一声. ...
- 如何避免测试人员提交重复的Bug
我们在软件测试过程中,由于不同人员测试同一个项目,所以往往会出现Bug重复提交情况,导致对整个项目和人员产生影响: 浪费测试人员时间和精力,从而影响测试进度 浪费开发人员重复看Bug时间 若开发人员由 ...
- mysqli预处理和事务处理
1 应用环境 mysqli预处理功能(大量数据处理时使用) 2 步骤 a)mysqli连接数据库 $mysqli = new mysqli('localhost','root','root','chu ...
- iOS获取窗口当前显示的控制器
解决类似网易新闻客户端收到新闻推送后,弹出一个UIAlert,然后跳转到新闻详情页面这种需求 1.提供一个UIView的分类方法,这个方法通过响应者链条获取view所在的控制器 - (UIViewCo ...
- VelocityTracker
VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch event, VelocityTracker通过跟踪一连串事件实时计算出 当前的速度,这样的用法在androi ...
- 【C#】窗体动画效果
通过调用API可以实现C#窗体的动画效果,主要调用user32.dll的行数AnimateWindow 1.函数申明 [System.Runtime.InteropServices.DllImport ...
- C语言 百炼成钢3
//题目7:用*号输出空心菱形图案 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...
- 关于错误提示:此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的解决方案
vs上的一个项目,弄了一个aes加密算法.提示说:调用的目标异常.此实现不是 Windows 平台 FIPS 验证的加密算法的一部分.弄了好久一直不行.解决不了.最后找了半天资料终于解决了.估计下来. ...