博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AC日记——狼抓兔子 bzoj 1001
阅读量:7225 次
发布时间:2019-06-29

本文共 2397 字,大约阅读时间需要 7 分钟。

Description

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

 

左上角点为(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

HINT

 

 2015.4.16新加数据一组,可能会卡掉从前可以过的程序。

 
思路:
  dinic裸。
  预处理略恶心;
 
 
来,上代码:
#include 
#include
#include
#include
#include
#define maxn 1000001#define INF 0x7fffffffusing namespace std;struct EdgeType { int to,next,flow;};struct EdgeType edge[maxn<<3];int if_z,n,m,cnt,s,t,deep[maxn],ans,head[maxn];char Cget;inline void read_int(int &now){ now=0,if_z=1,Cget=getchar(); while(Cget>'9'||Cget<'0') { if(Cget=='-') if_z=-1; Cget=getchar(); } while(Cget>='0'&&Cget<='9') { now=now*10+Cget-'0'; Cget=getchar(); } now*=if_z;}inline void edge_add(int from,int to,int flow){ edge[++cnt].to=from,edge[cnt].next=head[to],edge[cnt].flow=flow,head[to]=cnt; edge[++cnt].to=to,edge[cnt].next=head[from],edge[cnt].flow=flow,head[from]=cnt;}bool search(){ memset(deep,0,sizeof(deep)); queue
que; que.push(s); deep[s]=1; while(!que.empty()) { int now=que.front(); for(int i=head[now];i;i=edge[i].next) { if(edge[i].flow&&deep[edge[i].to]==0) { que.push(edge[i].to); deep[edge[i].to]=deep[now]+1; } } que.pop(); } if(deep[t]==0) return false; else return true;}int Search(int now,int flow_){ if(now==t) return flow_; int pos,Flow=0; for(int i=head[now];i;i=edge[i].next) { if(edge[i].flow&&deep[edge[i].to]==deep[now]+1) { pos=flow_-Flow; pos=Search(edge[i].to,min(pos,edge[i].flow)); edge[i].flow-=pos; edge[i-1].flow+=pos; Flow+=pos; if(Flow==flow_) return flow_; } } if(Flow==0) deep[now]=0; return Flow;}int main(){ read_int(n),read_int(m); int pos; s=1,t=n*m; for(int i=0;i

 

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6370438.html

你可能感兴趣的文章
保守的国美再一次进击社交电商,前途未卜?
查看>>
git
查看>>
Python学习教程(Python学习路线):Python 3—手动创建迭代器
查看>>
说说如何在 Virtual Box 中新建 CentOS 虚拟机
查看>>
Cordova + Vue 实现点击两次退出应用
查看>>
JAVA 多用户商城系统b2b2c-Spring Cloud Stream 介绍
查看>>
spring cloud构建互联网分布式微服务云平台-SpringCloud集成项目简介
查看>>
基于房源的画像分析
查看>>
80% UI 初学者走过的弯路,你走了几条?
查看>>
文档和元素的几何滚动
查看>>
php 设计模式
查看>>
Java springcloud B2B2C o2o多用户商城 springcloud架构(八)springboot整合mongodb
查看>>
3年工作经验的Java程序员面试经过
查看>>
Mysql 批量写入数据,对于这类性能问题,你是如何优化的
查看>>
MySQL无法启动几种常见问题小结
查看>>
阿里CTO:阿里所有技术和产品输出都将必须通过阿里云进行
查看>>
更好用的集群限流功能,Sentinel 发布 v1.4.2
查看>>
Python(生成执行文件)
查看>>
redis安装配置 - ttlsa教程系列之redis
查看>>
Linux --DHCP服务器配置;DHCP服务器中继
查看>>