BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)
http://www.lydsy.com/JudgeOnline/problem.php?id=1001
题意:
思路:
这道题目是最小割题目,但是吧你直接套用Dinic是会超时的。
这里有种很奇妙的做法啊,具体可以参见论文:《浅析最大最小定理在信息学竞赛中的应用》--周冬
S-T平面图:首先是一平面图(满足欧拉公式与存在对偶图),且源点S,汇点T在边界上。将S-T连线,将最外面的一个大面(无限大)一分为二了,一个为S,一个为T。然后将每条边两边的面相连,权值就是该边权值。最后跑最短路,它经过的路径就是原图中的边,最短路也就变成了最小割。
http://blog.csdn.net/ahero_happy/article/details/6637214该博主讲得不错,可以看一下。
一开始写了个最普通的最短路,结果超时。然后写了带队优化的,超内存了,因为用了vector来存储,最后只好改用数组来存储。
- /**************************************************************
- Problem: 1001
- User: Vortex
- Language: C++
- Result: Accepted
- Time:2112 ms
- Memory:89184 kb
- ****************************************************************/
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #include<cstdio>
- #include<sstream>
- #include<vector>
- #include<stack>
- #include<queue>
- #include<cmath>
- #include<map>
- #include<set>
- using namespace std;
- typedef long long ll;
- typedef pair<int,int> pll;
- const int INF = 0x3f3f3f3f;
- const int maxn = ** + ;
- int n, m;
- int num;
- int src, dst;
- struct Edge
- {
- int v, w;
- int next;
- }edge[*maxn];
- struct HeapNode
- {
- int d, u;
- HeapNode(int x, int y) :d(x), u(y){}
- bool operator < (const HeapNode& rhs) const{
- return d > rhs.d;
- }
- };
- int head[maxn];
- bool done[maxn];
- int d[maxn];
- void AddEdges(int u, int v, int w)
- {
- edge[num].v=v ;edge[num].w=w ;
- edge[num].next=head[u] ;head[u]=num++ ;
- }
- void dijkstra(int s)
- {
- priority_queue<HeapNode> Q;
- for (int i = ; i <=dst; i++) d[i] = INF;
- d[s] = ;
- memset(done, , sizeof(done));
- Q.push(HeapNode(,s));
- while (!Q.empty())
- {
- HeapNode x = Q.top(); Q.pop();
- int u = x.u;
- if (done[u]) continue;
- done[u] = true;
- for (int i = head[u]; i!=-; i=edge[i].next)
- {
- if (d[edge[i].v] > d[u] + edge[i].w)
- {
- d[edge[i].v] = d[u] + edge[i].w;
- Q.push(HeapNode(d[edge[i].v],edge[i].v));
- }
- }
- }
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- while(~scanf("%d%d",&n,&m))
- {
- src=,dst=*(n-)*(m-)+;
- memset(head,-,sizeof(head));
- num=;
- for(int i=;i<=n;i++)
- {
- for(int j=;j<m;j++)
- {
- int u,v,w;
- scanf("%d",&w);
- if(i==) u=src;
- else u=(*(i-)-)*(m-)+j;
- if(i==n) v=dst;
- else v=(*(i-))*(m-)+j;
- AddEdges(u,v,w);
- AddEdges(v,u,w);
- }
- }
- for(int i=;i<n;i++)
- {
- for(int j=;j<=m;j++)
- {
- int u,v,w;
- scanf("%d",&w);
- if(j==) u=dst;
- else u=(*(i-))*(m-)+j-;
- if(j==m) v=src;
- else v=(*(i-))*(m-)+j-+m;
- AddEdges(u,v,w);
- AddEdges(v,u,w);
- }
- }
- for(int i=;i<n;i++)
- {
- for(int j=;j<m;j++)
- {
- int u,v,w;
- scanf("%d",&w);
- u=(*(i-))*(m-)+j;
- v=(*(i-)+)*(m-)+j;
- AddEdges(u,v,w);
- AddEdges(v,u,w);
- }
- }
- dijkstra(src);
- printf("%d\n",d[dst]);
- }
- return ;
- }
BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)的更多相关文章
- BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)
题目大意 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的.而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- BZOJ 1001: [BeiJing2006]狼抓兔子
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 20029 Solved: 4957[Submit][ ...
- BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 23822 Solved: 6012[Submit][ ...
- BZOJ 1001 [BeiJing2006]狼抓兔子 (UVA 1376 Animal Run)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 24727 Solved: 6276[Submit][ ...
- BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)
平面图的最小割转化为对偶图的最短路(资料:两极相通——浅析最大最小定理在信息学竞赛中的应用) ,然后DIJKSTRA就OK了. ------------------------------------ ...
- BZOJ 1001: [BeiJing2006]狼抓兔子 最小割
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓 ...
- [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- 【刷题】BZOJ 1001 [BeiJing2006]狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割
平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割 找到最小环(即最短路)极为所求,注意辅助边的建立 加入读入优化 不过时间还是一般 估计是dij写的不好 大神勿喷~~~ /*** ...
随机推荐
- OA系统部署短信过程
安装dotNetFx40_Client_setup.exe插件 安装mysql_installer_community_V5.6.21.1_setup.1415604646.msi数据库 根据数据库版 ...
- SQL Server 安装后改动计算机名带来的问题以及解决方法
USE master GO DECLARE @serverproperty_servername varchar(100), @servername varchar(100) --取得Windows ...
- 15 jmeter分布式性能测试
背景由于jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至还会引起Java内存溢出的错误.要解决这个问题,可以使用分布式测试,运行多台机器运用所 ...
- clientHeight , scrollHeight , offsetHeight之间的区别
clientHeight:元素客户区的大小,指的是元素内容及其边框所占据的空间大小(经过实践取出来的大多是视口大小) scrollHeight: 滚动大小,指的是包含滚动内容的元素大小(元素内容的总高 ...
- PAT Sign In and Sign Out[非常简单]
1006 Sign In and Sign Out (25)(25 分) At the beginning of every day, the first person who signs in th ...
- PNG格式图片常见转换方法
前言 最近碰到一个需要将图片由原始的PNG转化为JPG的需求,由于PNG图片本身质量等原因,导致转化为JPG之后,存在失真的问题,后来一个同事分享了下述的HighQualityPNGToJPG方法解决 ...
- .NET 互联网技术简介
概述 技术更新太快,尤其是在互联网公司里,很多新的主流技术,我们还是必须要知道和熟练使用的.下面就给大家简单介绍,入门还是需要大家更努力的去深入学习. 目录 Git 入门 常用软件安装及VS插件工具 ...
- Android下基于线程池的网络访问基础框架
引言 现在的Android开发很多都使用Volley.OkHttp.Retrofit等框架,这些框架固然有优秀的地方(以后会写代码学习分享),但是我们今天介绍一种基于Java线程池的网络访问框架. 实 ...
- cygwin本地.bashrc配置
echo -e "====================================================================================== ...
- uva1330 在一个大的矩阵中寻找面积最大的子矩阵
大白书 P50页 #include <algorithm> #include <cstdio> using namespace std; ; int ma[maxn][maxn ...