首页 技术 正文
技术 2022年11月8日
0 收藏 496 点赞 2,068 浏览 1881 个字

Description

现在小朋友们最喜欢的”喜羊羊与灰太狼”,话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:

狼抓兔子(bzoj 1010)

左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下解(N,M)的窝中去,狼王开始伏击这些兔子.当然为了保险起见,如果一条道路上最多通过的兔子数为K,狼王需要安排同样数量的K只狼,才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的狼的数量要最小。因为狼还要去找喜羊羊麻烦.

Input

第一行为N,M.表示网格的大小,N,M均小于等于1000.接下来分三部分第一部分共N行,每行M-1个数,表示横向道路的权值. 第二部分共N-1行,每行M个数,表示纵向道路的权值. 第三部分共N-1行,每行M-1个数,表示斜向道路的权值. 输入文件保证不超过10M

Output

输出一个整数,表示参与伏击的狼的最小数量.

Sample Input

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

Sample Output

14

/*
生涯第一次用dinic写网络流,先水一个最小割。
dinic的原理:先bfs一遍将残余网络分层,然后找增广路。
*/
#include<cstdio>
#include<iostream>
#include<queue>
#define N 1000010
#define inf 1000000000
using namespace std;
int head[N],dis[N],q[N*],ans,cnt=,S,T,n,m;
struct node{
int to,pre,f;
};node e[N*];
void add(int x,int y,int z){
e[++cnt].to=y;e[cnt].f=z;e[cnt].pre=head[x];head[x]=cnt;
e[++cnt].to=x;e[cnt].f=;e[cnt].pre=head[y];head[y]=cnt;
}
bool bfs(){
for(int i=;i<=T;i++)dis[i]=inf;
int h=,t=;
q[]=S;dis[S]=;
while(h<t){
int now=q[++h];
for(int i=head[now];i;i=e[i].pre){
int v=e[i].to;
if(e[i].f&&dis[now]+<dis[v]){
dis[v]=dis[now]+;
if(v==T)return true;
q[++t]=v;
}
}
}
if(dis[T]=inf)return false;
return true;
}
int dinic(int now,int f){
if(now==T)return f;
int rest=f;
for(int i=head[now];i;i=e[i].pre){
int v=e[i].to;
if(e[i].f&&dis[v]==dis[now]+&&rest){
int t=dinic(v,min(rest,e[i].f));
if(!t)dis[v]=;
e[i].f-=t;
e[i^].f+=t;
rest-=t;
}
}
return f-rest;
}
int main(){
scanf("%d%d",&n,&m);
S=;T=n*m+;
add(S,,inf);add(n*m,T,inf);
for(int i=;i<=n;i++)
for(int j=;j<m;j++){
int w;scanf("%d",&w);
int u=(i-)*m+j;
add(u,u+,w);
add(u+,u,w);
}
for(int i=;i<n;i++)
for(int j=;j<=m;j++){
int w;scanf("%d",&w);
int u=(i-)*m+j;
add(u,u+m,w);
add(u+m,u,w);
}
for(int i=;i<n;i++)
for(int j=;j<m;j++){
int w;scanf("%d",&w);
int u=(i-)*m+j;
add(u,u+m+,w);
add(u+m+,u,w);
}
while(bfs())ans+=dinic(S,inf);
printf("%d",ans);
return ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,110
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,584
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,431
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,202
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,837
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,920