题目描述 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]狼抓兔子相关推荐

  1. BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流

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

  2. BZOJ1001[BeiJing2006]狼抓兔子——最小割

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

  3. bzoj1001:[BeiJing2006]狼抓兔子

    传送门 最小割,一眼最小割,这个甚至不需要建什么模型,直接按它给的建就好了,最小割=最大流,跑个最大流就行了,注意:图是无向图 #include<cstdio> #include<q ...

  4. BZOJ1001 [BeiJing2006]狼抓兔子 (网络流)

    题意分析 一看就是一道网络流的题目,然后上去最大流直接搞. 然后发现超时了,所以学了一波当前弧优化,然后就过了. 然后我觉得还可以再快一点,就IO加速了一下, 发现速度提高了400ms. 嗯,FAST ...

  5. bzoj1001 [BeiJing2006]狼抓兔子(最小割/平面图最大流转对偶图最短路)

    首先这题显然就是求一个最小割.然后跑dinic加点优化也是可以过的. 这题还有一种更妙的做法:st平面图最大流转对偶图最短路.大概做法就是首先在原图中加一条s->t的边,然后把原图的一个面当作一 ...

  6. 【BZOJ1001】狼抓兔子题解

    BZOJ1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还 ...

  7. BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 23822  Solved: 6012 [Submit ...

  8. 1001: [BeiJing2006]狼抓兔子(对偶图)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 23595  Solved: 5940 Descrip ...

  9. 【BZOJ1001】狼抓兔子

    [BZOJ1001]狼抓兔子 题面 bzoj 题解 懒得平面图转对偶图了,直接最小割板子加优化. #include <iostream> #include <cstdio> # ...

最新文章

  1. KNN算法(K最近邻算法)详解
  2. SAP MM 事务代码MI31之思考之续集
  3. 企业微信 添加白名单_企业微信群为什么只能加200人?企业微信群怎么申请扩容?...
  4. 最佳适应算法模拟内存分配
  5. 解决Android studio在虚拟机上可以正常运行,而在手机上闪退的问题
  6. “为爱尖叫”,爱奇艺的晚会聚能术与商业价值释放场
  7. AD7606数据采集模块使用方法
  8. arg min什么意思
  9. Oracle RAC集群安装,从零开始
  10. Form表单之get提交与post提交
  11. 专家:大数据正成为促进经济转型新动能
  12. 《沈剑架构师训练营》第7章 - 架构解耦
  13. 计算机用word做海报,如何用Word文档做出一张简单的海报!
  14. Matlab与V-REP联合仿真 | Joint simulation of MATLAB and V-REP
  15. 程序员如何自我认知 自我了解
  16. powershell获取linux文件,技术|微软爱上 Linux:当 PowerShell 来到 Linux 时
  17. 虚拟化技术之docker技术详解
  18. 亿佰特串口服务器接入阿里云物模型使用教程
  19. 自然语言理解应用API对比报告
  20. gson解析字符串中带引号

热门文章

  1. DWZ中navTab使用解析
  2. leetcode - 96. 不同的二叉搜索树
  3. matlab设计声音听听
  4. CART树回归、剪枝、Tkinter GUI
  5. VB/VBA中实现数据库与文件的存取
  6. CCD摄像头视场角计算公式
  7. redis入门——安装篇
  8. Java实战-坦克大战
  9. 软件工程 - 版本管理 - git 的基本实用方法 - 添加一个完整的项目目录的命令的细微差别
  10. ubuntu + vmware7.0 gmake not found