BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】
1001: [BeiJing2006]狼抓兔子
Time Limit: 15 Sec Memory Limit: 162 MB
Submit: 23822 Solved: 6012
[Submit][Status][Discuss]
Description

Input
Output
输出一个整数,表示参与伏击的狼的最小数量.
Sample Input
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
Sample Output
HINT
2015.4.16新加数据一组,可能会卡掉从前可以过的程序。
Source
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001
分析:最大流写法如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
inline int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
inline void write(int x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>)
{
write(x/);
}
putchar(x%+'');
}
int ne;
const int N=;
struct data
{
int to,next,v;
}e[N<<];
int head[N];
int h[N],q[N],ans;
inline void update(int u,int v,int w)
{
ne++;
e[ne].to=v;
e[ne].v=w;
e[ne].next=head[u];
head[u]=ne;
}
inline bool BFS()
{
int now,i;
memset(h,-,sizeof(h));
int t=,w=;
q[t]=;
h[]=;
while(t<w)
{
now=q[t];
t++;
i=head[now];
while(i)
{
if(e[i].v&&h[e[i].to]<)
{
q[w++]=e[i].to;
h[e[i].to]=h[now]+;
}
i=e[i].next;
}
}
if(h[n*m]==-)
return false;
return true;
}
inline int DFS(int x,int f)
{
if(x==n*m)
return f;
int i=head[x];
int w,used=;
while(i)
{
if(e[i].v&&h[e[i].to]==h[x]+)
{
w=f-used;
w=DFS(e[i].to,min(w,e[i].v));
e[i].v-=w;
e[i+].v+=w;
used+=w;
if(used==f)
return f;
}
i=e[i].next;
}
if(!used)
h[x]=-;
return used;
}
inline void dinic()
{
while(BFS())
{
ans+=DFS(,0x7f7f7f7f);
}
}
int main()
{
n=read();
m=read();
int x;
for(int i=;i<=n;i++)
{
for(int j=;j<m;j++)
{
x=read();
update(m*(i-)+j,m*(i-)+j+,x);
update(m*(i-)+j+,m*(i-)+j,x);
}
}
for(int i=;i<n;i++)
{
for(int j=;j<=m;j++)
{
x=read();
update(m*(i-)+j,m*(i)+j,x);
update(m*(i)+j,m*(i-)+j,x);
}
}
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
x=read();
update(m*(i-)+j,m*(i)+j+,x);
update(m*(i)+j+,m*(i-)+j,x);
}
}
dinic();
write(ans);
return ;
}
分析:最小割,上网看了别人的博客,学习到了s-t平面图的最小割的解法,把原图中的面看作点,起点和终点都等同于最外面的那一个面,原图中一条边权值为w,新图中就等同于此边在平面图中分割开的两个面(即新图中两个点)连一条边,权值为w。建模完成后,新图中的起点和终点的一条路径就穿插过原图的一些边,即一条路径等于原图中的一个割,所以最小割就等于新图的最短路径长度。确实很厉害。
下面给出SPFA+最小割代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
inline void write(int x)
{
if(x<)
{
putchar('-');
x=-x;
}
if(x>)
{
write(x/);
}
putchar(x%+'');
}
#define M 2000001
int n,m,nm;
struct data
{
int to,next,v;
}e[*M];
int dis[M],q[M],head[M];
bool flag[M];
int ne;
inline void update(int u,int v,int w)
{
ne++;
e[ne].to=v;
e[ne].v=w;
e[ne].next=head[u];
head[u]=ne;
ne++;
e[ne].to=u;
e[ne].v=w;
e[ne].next=head[v];
head[v]=ne;
}
inline void spfa()
{
memset(dis,0x3f,sizeof(dis));
int i,t=,w=;
dis[]=q[w]=;flag[]=;
while(t!=w)
{
int u=q[t++];
flag[u]=;
if(t==M)t=;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(dis[v]>dis[u]+e[i].v)
{
dis[v]=dis[u]+e[i].v;
if(flag[v]==)
{
flag[v]=;
q[w++]=v;
if(w==M)w=;
}
}
}
}
}
int main()
{
n=read();
m=read();
nm=(n*m-m-n+)<<;
int x;
for(int j=;j<m;j++)
{
x=read();
update(j,nm+,x);
}
for(int i=;i<n-;i++)
{
for(int j=;j<m;j++)
{
x=read();
update((i<<)*(m-)+j,((i<<)-)*(m-)+j,x);
}
}
for(int j=;j<m;j++)
{
x=read();
update(,((n<<)-)*(m-)+j,x);
}
for(int i=;i<n-;i++)
{
for(int j=;j<=m;j++)
{
x=read();
if(j==)
update(,(i<<)*(m-)+m,x);
else if(j==m)
update((i<<|)*(m-),nm+,x);
else
update((i<<)*(m-)+j-,(i<<)*(m-)+j+m-,x);
}
}
for(int i=;i<n-;i++)
{
for(int j=;j<m;j++)
{
x=read();
update((i<<|)*(m-)+j,(i<<)*(m-)+j,x);
}
}
spfa();
write(dis[nm+]);
return ;
}
BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】的更多相关文章
- BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)
题目大意 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的.而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- BZOJ 1001: [BeiJing2006]狼抓兔子
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 20029 Solved: 4957[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]狼抓兔子(s-t平面图+最短路求最小割)
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 题意: 思路:这道题目是最小割题目,但是吧你直接套用Dinic是会超时的. 这里有种很奇妙的做 ...
- [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图
狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- BZOJ 1001: [BeiJing2006]狼抓兔子 最小割
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓 ...
- [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- 【刷题】BZOJ 1001 [BeiJing2006]狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
随机推荐
- Jenkins+github+maven+git+linux
Jenkins:持续集成的一个工具 github:远程存放代码 maven:利用maven创建项目,配置pom.xm依赖 git :本地仓库,可以提交代码到远程(我都是使用git 在git bush ...
- 《Office 365 开发入门指南》公开邀请试读,欢迎反馈
终于等来了这一天,可以为我的这本新书画上一个句号.我记得是在今年的2月份从西雅图回来之后,就萌发了要为中国的Office 365开发人员写一些东西并最终能帮到更多中国用户的想法,而从2月26日正式写下 ...
- DNS查询相关
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/45 一种简单的设计方式是在因特网上使用一个DNS服务器,该服务器 ...
- python方法的延迟加载
数据挖掘的过程中,数据进行处理是一重要的环节,我们往往会将其封装成一个方法,而有的时候这一个方法可能会被反复调用,每一次都对数据进行处理这将是一个很耗时耗资源的操纵,那么有没有办法将计算后的结果缓存起 ...
- bzoj 4199 [NOI2015]寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
- [编织消息框架][消息服务]rmi
RMI(即Remote Method Invoke 远程方法调用) 远程对象: 用于远程客户端调用 必需继承java.rmi.Remote,每个调用方法必须添加java.rmi.RemoteExcep ...
- Webpack 2 视频教程 018 - 使用可视化图表进行统计分析打包过程
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- what is cdecl?
cdecl这是一个Linux上功能很强大的一个小型程序,它最主要的功能就是能帮助我们解释一个很复杂的C语言声明. 例如,我写了这样一个C语言的一个声明:int *(*g[])(int , floa ...
- Robot Framework学习笔记(十)------Selenium2Library库
一.安装selenium2library库 如果已经安装了pip,则使用管理员模式打开windows命令行,输入pip install robotframework-selenium2library, ...
- js设置元素class方法小结及classList相关
给DOM元素设置class是我们在项目中非常容易遇到的,网上的资料和总结也比较多,下面比较全面的整理一下,希望给到大家一些帮助!并引用两种成熟的classList的兼容方法 一.el.setA ...