bzoj 1001: [BeiJing2006]狼抓兔子
来源:互联网 发布:手机主题软件下载 编辑:程序博客网 时间:2024/05/21 07:59
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
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
这很显然是一道最小割的题目。但是因为有很多边,如果用网络流算法会TLE。所以说有一个神奇的做法。详看周冬的论文《浅谈最大最小定理在信息学竞赛中的应用》。把平面图最小割转化成对偶图最短路来做就行了。。我用的是spfa。据说dijkstra堆优化会更快。
#include<queue>#include<cstdio>#include<string>#include<cstring>using namespace std;int head[8000001];struct map{ int f; int s,t; int next;}a[6000001];int edge;inline void add(int s,int t,int f){ a[edge].next=head[s]; head[s]=edge; a[edge].s=s; a[edge].t=t; a[edge].f=f;}int dis[3000001];bool v[3000001];queue <int>Q;inline void spfa(){ memset(dis,127,sizeof(dis)); memset(v,false,sizeof(v)); while(!Q.empty()) Q.pop(); Q.push(0); dis[0]=0; v[0]=true; int d; while(!Q.empty()) { d=Q.front(); Q.pop(); v[d]=false; int i; for(i=head[d];i!=0;i=a[i].next) { int t=a[i].t; if(dis[d]+a[i].f<dis[t]) { dis[t]=dis[d]+a[i].f; if(!v[t]) { Q.push(t); v[t]=true; } } } }}int main(){ int n,m; scanf("%d%d",&n,&m); n--; m--; int i,j; int x; for(i=1;i<=n+1;i++) { for(j=1;j<=m;j++) { scanf("%d",&x); if(i==1) { edge++; add(j+n*m,n*m*2+1,x); // edge++; // add(n*m*2+1,j+n*m,x); } else if(i==n+1) { edge++; add(0,(n-1)*m+j,x); // edge++; // add((n-1)*m+j,0,x); } else { edge++; add((i-2)*m+j,(i-1)*m+j+n*m,x); edge++; add((i-1)*m+j+n*m,(i-2)*m+j,x); } } } for(i=1;i<=n;i++) { for(j=1;j<=m+1;j++) { scanf("%d",&x); if(j==1) { edge++; add(0,(i-1)*m+j,x); // edge++; // add((i-1)*m+j,0,x); } else if(j==m+1) { edge++; add(i*m+n*m,n*m*2+1,x); // edge++; // add(n*m*2+1,i*m+n*m,x); } else { edge++; add((i-1)*m+j-1+n*m,(i-1)*m+j,x); edge++; add((i-1)*m+j,(i-1)*m+j-1+n*m,x); } } } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&x); edge++; add((i-1)*m+j,(i-1)*m+j+n*m,x); edge++; add((i-1)*m+j+n*m,(i-1)*m+j,x); } } spfa(); printf("%d\n",dis[n*m*2+1]); return 0;}
0 0
- bzoj 1001: [BeiJing2006]狼抓兔子
- BZOJ 1001: [BeiJing2006]狼抓兔子
- bzoj 1001: [BeiJing2006]狼抓兔子
- bzoj 1001: [BeiJing2006]狼抓兔子
- BZOJ 1001: [BeiJing2006] 狼抓兔子
- BZOJ 1001: [BeiJing2006]狼抓兔子
- BZOJ 1001 [BeiJing2006]狼抓兔子
- BZOJ-1001 [BeiJing2006]狼抓兔子
- [BZOJ]1001: [BeiJing2006]狼抓兔子
- 【BZOJ】1001: [BeiJing2006]狼抓兔子
- BZOJ 1001 [BeiJing2006] 狼抓兔子
- BZOJ 1001: [BeiJing2006]狼抓兔子
- bzoj 1001: [BeiJing2006]狼抓兔子
- BZOJ 1001: [BeiJing2006]狼抓兔子
- BZOJ 1001: [BeiJing2006]狼抓兔子
- BZOJ 1001 [BeiJing2006]狼抓兔子
- BZOJ 1001: [BeiJing2006]狼抓兔子
- 【bzoj 1001】 狼抓兔子 [BeiJing2006]
- 学习Linux二(创建、删除文件和文件夹命令)
- linux下mysql的root密码忘记解决方
- UVa 10282 - Babelfish
- 唐僧西行并不是公派出国学习
- 唐僧西行并不是公派出国学习
- bzoj 1001: [BeiJing2006]狼抓兔子
- tinyxml学习一
- 进程切换与TSS
- 基于MFC的U盘检测
- tinyxml学习2
- 欧几里得算法与扩展欧几里得算法
- PPT如何控制画布尺寸
- PPT如何导出图片
- tiny学习3