【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分割出来的两面对应的两个点跑最 ...
随机推荐
- 快速创建显示数字数据的动画——CountUp.js
由于项目需求,需要写一个数字增/减量的动画特效,最后找到了CountUp.js CountUp.js是一个无依赖,轻量级的JavaScript“类”,可用于快速创建以更有趣的方式显示数字数据的动画. ...
- C# Winform WebBrowser控件
C# WinForm WebBrowser 1.主要用途:使用户可以在窗体中导航网页. 2.注意:WebBrowser 控件会占用大量资源.使用完该控件后一定要调用 Dispose 方法,以便确保及时 ...
- CMDB介绍
CMDB https://lupython.gitee.io/2018/05/05/CMDB%E4%BB%8B%E7%BB%8D/ 尚泽凯博客地址 传统运维与自动化运维的区别 传统运维: 1.项目 ...
- maven 添加自己下载的jar包到本地仓库
1.在pom文件中添加依赖,其中groupId等变量都自拟. 例如: 2.在命令行执行以下命令,提示build success即表示安装成功. mvn install:install-file -Dg ...
- wamp调用ICE中间件
wamp调用ICE中间件 wamp 是集成开发包,我的wamp中的php 为5.3.10 ,经过3天艰苦奋战,终于在phpinfo()中看到了 ICE 出现了.. OK,最新的ice 为 3.5.1 ...
- 数据库 MySQL part2
表记录的操作 增 1.插入一条记录 语法:insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......); ...
- 【娱乐向】制作Chrome天气预报扩展程序
1.什么是Chrome扩展程序 Chrome扩展程序是一个用Web技术开发,用来扩展增强浏览器功能的软件.和一般的网页一样,Chrome扩展程序由html.js.css和图片等部分组成.Chrome插 ...
- Git 查看远程分支、本地分支、删除本地分支及远程分支
1. 删除本地分支: git branch -d branchName 2. 删除远程分支: // 方法一:将删除的本地分支推到远程(要删除的远程分支在本地有映射) git push origin : ...
- linux的常用易忘命令
1.查看软件安装路径 [root@localhost ~]# which gcc /usr/bin/gcc 查询进程 ps -ef |grep redis 查看端口 netstat -lntp |g ...
- 关于transition动画下,如果有fixed元素,渲染的奇葩问题
之前我们机票页面有生成一个低价日历,然后我们有一个需求就是滚动到那个月份,对应显示这个月,然后这个区域是fixed定位的,然后奇怪的事情发生了,就是低价日历的动画执行完后,修改页面的html却没有正常 ...