1001: [BeiJing2006]狼抓兔子

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit: 24727  Solved: 6276
[Submit][Status][Discuss]

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

Source

[Submit][Status][Discuss]

题目大意:在一个n×m的网格图中,要求从(1,1)到(n,m)不连通,那么最少断掉的边权之和。
题解:

  直接看是网络流的最小割问题了。但是n×m个点=1000000,边更是3000000条,那么最小割显然不太好。因为是网格图,又是从(1,1)到(n,m)不连通,那么一定是从左边或下边,到上边或右边,那么我们就找一条从左下角到右上角的路径就可以断开连接了。把每一个三角形看成一个点,相邻三角形之间连接一条公共边边权的边,就可以跑最短路了,SPFA和Dij都可以。注意数组不要开小了。

具体见下图:

将每一个三角形编一个号,两个三角形之间连边,再将边界上的三角形连入源点和汇点即可了。

 #include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define fre(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
const int MAXN=,INF=0x3f3f3f3f;
int n,m,S,T,x,num,CASE;
int dis[MAXN];
int head[MAXN],to[MAXN*],Next[MAXN*],len[MAXN*];
bool vis[MAXN];
struct ed
{
int id,dis;
bool operator <(const ed a)const{
return dis>a.dis;
}
};
void inti();
void add(int f,int t)
{
Next[++num]=head[f];
to[num]=t;
len[num]=x;
head[f]=num;
}
void Dij()
{
priority_queue<ed>Q;
memset(dis,0x3f3f3f3f,sizeof dis);
memset(vis,,sizeof vis);
Q.push((ed){S,}); dis[S]=;
while(!Q.empty())
{
ed u=Q.top(); Q.pop();
if(u.id==T)break;
vis[u.id]=;
for(int i=head[u.id];i;i=Next[i])
{
int v=to[i];
if(vis[v])continue;
if(dis[v]>dis[u.id]+len[i])
{
dis[v]=dis[u.id]+len[i];
Q.push((ed){v,dis[v]});
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==m&&n==)break;
num=;
memset(head,,sizeof head);
inti();
Dij();
printf("Case %d: Minimum = %d\n",++CASE,dis[T]);
//printf("%d\n",dis[T]);
}
return ;
}
void inti()//连边,比较容易搞错。
{
S=(n-)*(m-)*+; T=S+;
for(int i=;i<=n;i++)
for(int j=;j<m;j++)
{
scanf("%d",&x);
if(i==) add(j,T),add(T,j);
else if(i==n) add(S,(n-)*(m-)*-(m-)+j),add((n-)*(m-)*-(m-)+j,S);
else
{
int a=(i-)*(m-)*-(m-)+j;
int b=a+(m-);
add(a,b); add(b,a);
}
}
for(int i=;i<n;i++)
for(int j=;j<=m;j++)
{
scanf("%d",&x);
if(j==) add(S,(i-)*(m-)*+(m-)+),add((i-)*(m-)*+(m-)+,S);
else if(j==m) add((i-)*(m-)*+(m-),T),add(T,(i-)*(m-)*+(m-));
else
{
int a=(i-)*(m-)*+(j-);
int b=a++(m-);
add(a,b); add(b,a);
}
}
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
scanf("%d",&x);
int a=(i-)*(m-)*+j;
int b=a+(m-);
add(a,b); add(b,a);
}
}

BZOJ 1001 [BeiJing2006]狼抓兔子 (UVA 1376 Animal Run)的更多相关文章

  1. BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)

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

  2. BZOJ 1001: [BeiJing2006]狼抓兔子

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 20029  Solved: 4957[Submit][ ...

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

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

  4. BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)

    平面图的最小割转化为对偶图的最短路(资料:两极相通——浅析最大最小定理在信息学竞赛中的应用) ,然后DIJKSTRA就OK了. ------------------------------------ ...

  5. BZOJ 1001: [BeiJing2006]狼抓兔子 最小割

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓 ...

  6. [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)

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

  7. 【刷题】BZOJ 1001 [BeiJing2006]狼抓兔子

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

  8. bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割

    平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割  找到最小环(即最短路)极为所求,注意辅助边的建立 加入读入优化  不过时间还是一般  估计是dij写的不好   大神勿喷~~~ /*** ...

  9. BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 题意: 思路:这道题目是最小割题目,但是吧你直接套用Dinic是会超时的. 这里有种很奇妙的做 ...

随机推荐

  1. WordPress 权限方案

    每个主机和主机的情况可能有所差异,如下只是概括性地描述,并不一定适用于所有情况.它只适用于进行“常规设置”的情况(注:比如通过“suexec”方式来进行共享主机的,详情见下方) 通常,所有文件是由您的 ...

  2. 【SQL Server 学习系列】-- ConnectionTimeout、CommandTimeout和BulkCopyTimeout

    1. SqlConnection.ConnectionTimeout获取在尝试建立连接时终止尝试并生成错误之前所等待的时间.单位:秒默认值:15秒设置为0时,表示无限制 2. SqlCommand.C ...

  3. 解决Coldfusion连接MySQL数据库的问题

    在连接MySQL时,出现了如下错误: Connections to MySQL Community Server are not supported. Please contact MySQL to ...

  4. linux中的线程局部存储(TLS)

    http://blog.csdn.net/cywosp/article/details/26469435

  5. 多硬盘分区管理fdisk

    原文:http://blog.fens.me/linux-fdisk/ ---------------------------------------------------------------- ...

  6. Scala入门到精通——第十六节 泛型与注解

    本节主要内容 泛型(Generic Type)简单介绍 注解(Annotation)简单介绍 注解经常使用场景 1. 泛型(Generic Type)简单介绍 泛型用于指定方法或类能够接受随意类型參数 ...

  7. webpack-Modules(模块)

    模块(Modules) 在模块化编程中,开发者将程序分解成离散功能块(discrete chunks of functionality),并称之为模块. 每个模块具有比完整程序更小的接触面,使得校验. ...

  8. unix时间戳(unix timestamp)与北京时间的互转方法

    1.在linux bash下北京时间与unix时间戳互转: 获取unix timestamp: 命令:date "+%s" 输出:1372654714 获取北京时间: 命令:dat ...

  9. Memcache应用场景介绍

    面临的问题 对于高并发高訪问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题.特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰 值已经达到500的时候,那你的程序执行离崩溃的边 ...

  10. 初步学习C++中的继承关系

    继承机制是面向对象程序设计使代码能够复用的最重要的手段,它同意程序猿在保持原有类特性的基础上进行扩展,添加功能. 这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂 ...