[BZOJ1001]: [BeiJing2006]狼抓兔子
题目描述 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 Description
|
第一行为N,M.表示网格的大小,N,M均小于等于1000.
接下来分三部分
第一部分共N行,每行M-1个数,表示横向道路的权值.
第二部分共N-1行,每行M个数,表示纵向道路的权值.
第三部分共N-1行,每行M-1个数,表示斜向道路的权值.
输入文件保证不超过10M
|
输出描述 Output Description
|
输出一个整数,表示参与伏击的狼的最小数量.
|
样例输入 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
|
数据范围及提示 Data Size & Hint
|
像是一道裸网络流题,但是很显然会T飞。所以我们学习一个东西叫对偶图,建完对偶图之后跑一边Dijkstra即可。(注意连边时候细节)
#include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<queue> #include<cstdio> using namespace std; typedef long long LL; #define mem(a,b) memset(a,b,sizeof(a)) typedef pair<LL,int> PLI; inline int read() {int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f; } const int maxn=1010,maxe=2000010,oo=2147483647; struct Edge {int u,v,w,next;Edge() {}Edge(int _1,int _2,int _3,int _4): u(_1),v(_2),w(_3),next(_4) {} }e[maxe<<2]; int n,m,heng[maxn][maxn],shu[maxn][maxn],xie[maxn][maxn],first[maxe],ce=-1,s,t,all; LL dis[maxe]; bool vis[maxe]; priority_queue <PLI,vector<PLI>,greater<PLI> > Q; void addEdge(int a,int b,int c) {if(a<0 || b<0)return;e[++ce]=Edge(a,b,c,first[a]);first[a]=ce;// printf("%d %d %d\n",a,b,c); } LL Dijkstra() {for(int i=0;i<=all;i++)dis[i]=oo;dis[s]=0;Q.push(make_pair(0,s));while(Q.size()){int now=Q.top().second;Q.pop();if(vis[now])continue;vis[now]=1;for(int i=first[now];i!=-1;i=e[i].next)if(dis[now]+e[i].w<dis[e[i].v]){dis[e[i].v]=dis[now]+e[i].w;if(!vis[e[i].v])Q.push(make_pair(dis[e[i].v],e[i].v));}}return dis[t]; } int main() {mem(first,-1);n=read();m=read();for(int i=1;i<=n;i++)for(int j=1;j<m;j++)heng[i-1][j-1]=read();for(int i=1;i<n;i++)for(int j=1;j<=m;j++)shu[i-1][j-1]=read();for(int i=1;i<n;i++)for(int j=1;j<m;j++)xie[i-1][j-1]=read();n--;m--;s=2*n*m;t=s+1;all=t;for(int i=0;i<n;i++)addEdge(s,2*i*m+1,shu[i][0]);for(int i=0;i<m;i++)addEdge(s,2*(n*m-m+i)+1,heng[n][i]);for(int i=0;i<m;i++)addEdge(2*i,t,heng[0][i]);for(int i=0;i<n;i++)addEdge(2*(i*m+m-1),t,shu[i][m]);for(int i=0;i<n;i++)for(int j=0;j<m;j++){int num1=2*(m*i+j),num2=num1+1;if(j!=0)addEdge(num2,2*(m*i+j)-2,shu[i][j]);addEdge(num2,num1,xie[i][j]);if(i!=n-1)addEdge(num2,2*(m*(i+1)+j),heng[i+1][j]);addEdge(num1,num2,xie[i][j]);if(j!=m-1)addEdge(num1,2*(m*i+j)+3,shu[i][j+1]);if(i!=0)addEdge(num1,2*(m*(i-1)+j)+1,heng[i][j]);}printf("%lld\n",Dijkstra());return 0; }
View Code
转载于:https://www.cnblogs.com/FYH-SSGSS/p/6918427.html
[BZOJ1001]: [BeiJing2006]狼抓兔子相关推荐
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- BZOJ1001[BeiJing2006]狼抓兔子——最小割
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- bzoj1001:[BeiJing2006]狼抓兔子
传送门 最小割,一眼最小割,这个甚至不需要建什么模型,直接按它给的建就好了,最小割=最大流,跑个最大流就行了,注意:图是无向图 #include<cstdio> #include<q ...
- BZOJ1001 [BeiJing2006]狼抓兔子 (网络流)
题意分析 一看就是一道网络流的题目,然后上去最大流直接搞. 然后发现超时了,所以学了一波当前弧优化,然后就过了. 然后我觉得还可以再快一点,就IO加速了一下, 发现速度提高了400ms. 嗯,FAST ...
- bzoj1001 [BeiJing2006]狼抓兔子(最小割/平面图最大流转对偶图最短路)
首先这题显然就是求一个最小割.然后跑dinic加点优化也是可以过的. 这题还有一种更妙的做法:st平面图最大流转对偶图最短路.大概做法就是首先在原图中加一条s->t的边,然后把原图的一个面当作一 ...
- 【BZOJ1001】狼抓兔子题解
BZOJ1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还 ...
- BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 23822 Solved: 6012 [Submit ...
- 1001: [BeiJing2006]狼抓兔子(对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 23595 Solved: 5940 Descrip ...
- 【BZOJ1001】狼抓兔子
[BZOJ1001]狼抓兔子 题面 bzoj 题解 懒得平面图转对偶图了,直接最小割板子加优化. #include <iostream> #include <cstdio> # ...
最新文章
- KNN算法(K最近邻算法)详解
- SAP MM 事务代码MI31之思考之续集
- 企业微信 添加白名单_企业微信群为什么只能加200人?企业微信群怎么申请扩容?...
- 最佳适应算法模拟内存分配
- 解决Android studio在虚拟机上可以正常运行,而在手机上闪退的问题
- “为爱尖叫”,爱奇艺的晚会聚能术与商业价值释放场
- AD7606数据采集模块使用方法
- arg min什么意思
- Oracle RAC集群安装,从零开始
- Form表单之get提交与post提交
- 专家:大数据正成为促进经济转型新动能
- 《沈剑架构师训练营》第7章 - 架构解耦
- 计算机用word做海报,如何用Word文档做出一张简单的海报!
- Matlab与V-REP联合仿真 | Joint simulation of MATLAB and V-REP
- 程序员如何自我认知 自我了解
- powershell获取linux文件,技术|微软爱上 Linux:当 PowerShell 来到 Linux 时
- 虚拟化技术之docker技术详解
- 亿佰特串口服务器接入阿里云物模型使用教程
- 自然语言理解应用API对比报告
- gson解析字符串中带引号