【bzoj1001】[BeiJing2006]狼抓兔子 最小割+对偶图+最短路
题目描述

输入
输出
输出一个整数,表示参与伏击的狼的最小数量.
样例输入
3 4
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
样例输出
14
题解
最小割,转化成对偶图最短路来求。
由于点数边数都很大,直接跑最大流肯定会TLE。
想到题目中图有特殊规律,方便转化为对偶图。
于是可以先转化为对偶图,再求最短路。
步骤:
1.连一条s->t的边
2.为图中每个面积块标号,方法自己选择,s->t边内侧为(s'),外侧为(t')(反过来也一样,因为无向图)
3.连接题目中每条边挨着的两个面积块,权值为原边权,注意要连无向边。
效果:

其中黑色为原图边,红色为新点,蓝色为新边,蓝色数字为新边权。
看似很麻烦,点边很多,实际上堆优化Dijkstra很快,而Dinic慢到死。
然后跑堆优化Dijkstra即可。
#include <cstdio>
#include <cstring>
#include <utility>
#include <queue>
using namespace std;
priority_queue<pair<int , int> > q;
int head[2000010] , to[6000010] , len[6000010] , next[6000010] , cnt , dis[2000010] , vis[2000010];
void add(int x , int y , int z)
{
to[++cnt] = y;
len[cnt] = z;
next[cnt] = head[x];
head[x] = cnt;
}
int main()
{
int n , m , i , j , x , y , z , s , t;
scanf("%d%d" , &n , &m);
s = 0 , t = (n - 1) * (m - 1) * 2 + 1;
for(i = 1 ; i <= n ; i ++ )
{
for(j = 1 ; j < m ; j ++ )
{
scanf("%d" , &z);
if(i == 1) x = s; else x = (i - 2) * (m - 1) * 2 + (j - 1) * 2 + 1;
if(i == n) y = t; else y = (i - 1) * (m - 1) * 2 + (j - 1) * 2 + 2;
add(x , y , z) , add(y , x , z);
}
}
for(i = 1 ; i < n ; i ++ )
{
for(j = 1 ; j <= m ; j ++ )
{
scanf("%d" , &z);
if(j == 1) x = t; else x = (i - 1) * (m - 1) * 2 + (j - 2) * 2 + 2;
if(j == m) y = s; else y = (i - 1) * (m - 1) * 2 + (j - 1) * 2 + 1;
add(x , y , z) , add(y , x , z);
}
}
for(i = 1 ; i < n ; i ++ )
{
for(j = 1 ; j < m ; j ++ )
{
scanf("%d" , &z);
x = (i - 1) * (m - 1) * 2 + (j - 1) * 2 + 1;
y = (i - 1) * (m - 1) * 2 + (j - 1) * 2 + 2;
add(x , y , z) , add(y , x , z);
}
}
memset(dis , 0x3f , sizeof(dis));
dis[s] = 0;
q.push(make_pair(0 , s));
while(!q.empty())
{
x = q.top().second , q.pop();
if(vis[x]) continue;
vis[x] = 1;
for(i = head[x] ; i ; i = next[i])
if(dis[to[i]] > dis[x] + len[i])
dis[to[i]] = dis[x] + len[i] , q.push(make_pair(-dis[to[i]] , to[i]));
}
printf("%d\n" , dis[t]);
return 0;
}
【bzoj1001】[BeiJing2006]狼抓兔子 最小割+对偶图+最短路的更多相关文章
- BZOJ1001 [BeiJing2006]狼抓兔子 最小割 对偶图 最短路
原文链接http://www.cnblogs.com/zhouzhendong/p/8686871.html 题目传送门 - BZOJ1001 题意 长成上面那样的网格图求最小割. $n,m\leq ...
- BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 19528 Solved: 4818[Submit][ ...
- [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- BZOJ1001: [BeiJing2006]狼抓兔子 (最小割转最短路)
浅析最大最小定理在信息学竞赛中的应用---周东 ↑方法介绍 对于一个联通的平面图G(满足欧拉公式) 在s和t间新连一条边e; 然后建立一个原图的对偶图G*,G*中每一个点对应原图中每一个面,每一条边对 ...
- bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- BZOJ1001[BeiJing2006]狼抓兔子——最小割
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- bzoj 1001 [BeiJing2006]狼抓兔子——最小割转最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 #include<cstdio> #include<cstring& ...
- bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)
平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权. 然后从刚才加的s->t分割出来的两面对应的两个点跑最 ...
随机推荐
- spring配置多个视图解析
<!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceVie ...
- frame3.5安装出错
一般是因为禁用了microsoft update,可以在服务里禁用改为手动,之后启动,然后就可以安装
- 【Nginx一】Nginx服务器搭建
Nginx服务器搭建 Nginx服务器搭建 下载Nginx源码包 安装Nginx 解压Nginx安装包 安装Nginx依赖 启动Nginx 下载Nginx源码包 官网下载地址 命令:wget http ...
- jmeter测试报告优化
1.下载jmeter.results.shanhe.me.xsl 将该文件拷贝到jmeter\extras目录下 2.修改jmeter.results.shanhe.me.xsl 这里直接拷贝 jme ...
- Redis的自从复制(Master/Slave)
一.是什么? 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 二.能干嘛? 1.读写分离 2.容 ...
- GIT LFS 使用笔记
一.背景 由于git上传文件大小受限,所以我们需要使用GIT LFS对大小超过一定上限的大文件进行处理. 二.安装 linux上安装参见 https://askubuntu.com/questions ...
- loj136 (最小瓶颈路,多次询问)
题目描述 给定一个包含 n nn 个节点和 m mm 条边的图,每条边有一个权值.你的任务是回答 k kk 个询问,每个询问包含两个正整数 s ss 和 t tt 表示起点和终点,要求寻找从 s ss ...
- Angularjs 跨域post数据到springmvc
先贴网上己有解决方案链接: http://www.tuicool.com/articles/umymmqY (讲的是springmvc怎么做才可以跨域) http://my.oschina.net/ ...
- 5.hbase表新增数据同步之add_peer
一.前提主从集群之间能互相通讯: 二.在cluster1上(源集群): 1.查看集群已开启的peers hbase(main):011:0> list_peers PEER_ID CLUSTE ...
- Ubuntu中搭建Hadoop集群(简记)
stp1:在Vmware虚拟机上创建Ubantu.2环境 步骤:文件—>新建虚拟机—>典型(下一步)—>下一步——>位置(不建议放c盘,文件地址一定要全英文)—>下一步— ...