这道题是求图的最小割,也就是用最大流。但因为边太多,最大流算法会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. 读《深入理解Java虚拟机》有感——第二部分:虚拟机类加载机制

    一.类加载过程       执行时机:编译程序——>执行程序(JVM启动.程序运行),类加载发生在程序运行期间       各个阶段:分为加载阶段.连接阶段(验证.准备.解析).初始化.使用.卸 ...

  2. 项目回顾3-再谈图片上传-FormData+ajax上传

    上次在纠结图片上传用base64还是form表单,现在感觉好蠢,因为又开辟了第三条道路. 其实也根本用不到form 只需要一个上传文件的input就好了 <input id="file ...

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

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

  4. 本地不安装Oracle,plsql远程连接数据库

    由于Oracle的庞大,有时候我们需要在只安装Oracle客户端如plsql.toad等的情况下去连接远程数据库,可是没有安装Oracle就没有一切的配置文件去支持.最后终于发现一个很有效的方法,Or ...

  5. HASHKILL

    6ac66ed89ef9654cf25eb88c21f4ecd0是flag的MD5码,(格式为ctf{XXX_XXXXXXXXXXX_XXXXX})由一个0-1000的数字,下划线,纽约的一个区,下划 ...

  6. Spring addFlashAttribute

    redirectAttributes.addFlashAttribute("result",accountModel); 用这个可以绑定session 但是只能用一次,可以避免最后 ...

  7. javascript之享元模式

    实现享元模式的一般步骤: 1.将所有外在数据从目标类中剥离.具体做法是尽可能多的删除该类的属性,所删除的应该是那种因实例而异的属性.构造函数的参数也要这样处理,这些参数应该被添加到该类的各个方法. 这 ...

  8. 【C#】WM 消息大全

    消息名 消息值 说明 WM_CREATE 0x0001 应用程序创建一个窗口 WM_DESTROY 0x0002 一个窗口被销毁 WM_MOVE 0x0003 移动一个窗口 WM_SIZE 0x000 ...

  9. 2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程

    2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程 所有项目均带有软件,笔记,视频,源码 日期   课程(空内容代表放假) 2015/7/10 星期五 开学典礼 ...

  10. MATLAB对于文本文件(txt)数据读取的技巧总结(经典中的经典)

    振动论坛原版主eight的经典贴http://www.chinavib.com/thread-45622-1-1.html MATLAB对于文本文件(txt)进行数据读取的技巧总结(经典中的经典)由于 ...