这道题是求图的最小割,也就是用最大流。但因为边太多,最大流算法会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 ;
}
  •平面图性质
  1.(欧拉公式)如果一个连通的平面图有n个点,m条边和f个面,那么f=m-n+2
  2.每个平面图G都有一个与其对偶的平面图G*n,G*中的每个点对应G中的一个面n
 
  

【BZOJ 1001】狼抓兔子 对偶图+SPFA的更多相关文章

  1. BZOJ 1001 狼抓兔子 (最小割转化成最短路)

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

  2. BZOJ 1001 - 狼抓兔子 - [Dinic最大流][对偶图最短路]

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 Description现在小朋友们最喜欢的"喜羊羊与灰太狼", ...

  3. bzoj 1001狼抓兔子(对偶图+最短路)最大流

    推荐文章:<浅析最大最小定理在信息学竞赛中的应用>--周冬 题目 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...

  4. BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 算法讨论: 1.可以用最大流做,最大流等于最小割. 2.可以把这个图转化其对偶图,然 ...

  5. BZOJ 1001 狼抓兔子 平面图的最小割

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1001 题目大意: 见链接 思路: 求最小割,平面图的最小割等价于对偶图的最短路 直接建 ...

  6. bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...

  7. BZOJ 1001 狼抓兔子

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子 ...

  8. bzoj1001狼抓兔子 对偶图优化

    bzoj1001狼抓兔子 对偶图优化 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路 菜鸡总是要填坑的! 很明显让你求网格图的最 ...

  9. 【Bzoj】1001狼抓兔子(平面图最小割转对偶图最短路)

    YEAH 题目链接 终于做对这道题啦    建图的艰辛难以言表- - 顺便说一句我队列转STL啦 狼抓兔子的地图符合平面图定义,于是将该图转成对偶图并求出对偶图的最短路即可. 这篇博客给了我极大的帮助 ...

随机推荐

  1. 分享用于学习C++图像处理的代码示例

    为了便于学习图像处理并研究图像算法, 俺写了一个适合初学者学习的小小框架. 麻雀虽小五脏俱全. 采用的加解码库:stb_image 官方:http://nothings.org/ stb_image. ...

  2. Renderer.materials

    修改方法 meshBody.renderer.materials[].mainTexture= clothes[]; meshBody.renderer.materials[]=maters[]; 以 ...

  3. Jenkins学习六:修改Jenkins用户的密码

    很多时候在使用jenkins的时候忘记密码了,遇到这种情况,可以看看下面的讲解. Jenkins专有用户的数据存放在JENKINS_HOME/users目录.users目录的结构你一看就懂.users ...

  4. HTTPWatch使用

    注意:现在httpwatch也可以集成到火狐浏览器中. 一.介绍 HttpWatch是强大的网页数据分析工具.集成在Internet Explorer工具栏.包括网页摘要.Cookies管理.缓存管理 ...

  5. iOS获取窗口当前显示的控制器

    解决类似网易新闻客户端收到新闻推送后,弹出一个UIAlert,然后跳转到新闻详情页面这种需求 1.提供一个UIView的分类方法,这个方法通过响应者链条获取view所在的控制器 - (UIViewCo ...

  6. ndk开发教程以及问题解决方案

    一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语 ...

  7. poj3984迷宫问题 广搜+最短路径+模拟队列

    转自:http://blog.csdn.net/no_retreats/article/details/8146585   定义一个二维数组: int maze[5][5] = { 0, 1, 0, ...

  8. MySQL基础 - mysql命令行客户端

    在Linux系统当中,mysql作为一个客户端命令程序,在很大程度上连接数据库都是使用mysql,因此很有必要熟悉mysql命令行的使用. 这里假设数据库用户为icebug,密码为icebug_pas ...

  9. 查询EBS请求日志的位置和名称

    select * from FND_CONCURRENT_PROGRAMS_VL fcp where fcp.USER_CONCURRENT_PROGRAM_NAME like '%CUX%XXXX% ...

  10. 神奇的main方法详解

    main函数的详解:    public : 公共的. 权限是最大,在任何情况下都可以访问.        原因: 为了保证让jvm在任何情况下都可以访问到main方法.    static:  静态 ...