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 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
随机推荐
- iOS 面试题、知识点 之一
最近面试,发现这些题个人遇到的几率大一些,与大家分享一下,分三文给大家: 当然Xcode新版本与之前一版本的区别,以及iOS新特性是必要了解的吧. Xcode8 和iOS 10 在之前文章有发过,感兴 ...
- 排查程序死循环,死锁的方法 ——pstack
pstack命令可显示每个进程的栈跟踪,pstack $pid即可,pstack命令须由$pid进程的属主或者root运行. 这次出现cpu占比100%的情况,但看memory占比,并无异常,怀疑是某 ...
- async和enterproxy控制并发数量
聊聊并发与并行 并发我们经常提及之,不管是web server,app并发无处不在,操作系统中,指一个时间段中几个程序处于已经启动运行到完毕之间,且这几个程序都是在同一处理机上运行,并且任一个时间点只 ...
- 4、树莓派的中文:安装ftp,安装gcc,安装qt,编译qt程序,运行qt界面程序
本博文仅作本人操作过程的记录,留作备忘.自强不息 QQ1222698 1.安装FTP:sudo apt-get install vsftpd 2.配置FTP,修改,/etc/vsftpd.conf # ...
- 云计算---openstack镜像制作详解
一:本地部署KVM 1.安装KVM 1.1安装须知 查看CPU是否支持kvm完全虚拟机. [root@LINUX ~]# grep "flags" /proc/cpuinfofla ...
- Webpack 2 视频教程 018 - 使用可视化图表进行统计分析打包过程
原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...
- JAVA模板方法
package project01; abstract class MyRuntime{ public final void runtime(){ long starttime =System.cur ...
- K:正则表达式之进阶
子表达式: 前面所介绍的关于重复匹配的知识,其重复匹配的字符只作用于紧挨着的前一个字符而言,而有时候要将一个集体(姑且用该概念进行称呼)进行重复多遍的进行匹配,则使用前面所介绍的知识,其是无法做到的. ...
- js拖拽的封装
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- Exception: Unexpected End Of File(crontab)
Exception: Unexpected End Of File [solphire@hadoop02 tools]$ crontab -l 1 * * * * source /etc/profil ...