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. Linux硬件监控

    https://blog.csdn.net/qq_30353203/article/details/62222882

  2. 安装mysql时出现应用程序无法正常启动(0xc000007b)、初始化失败以及密码忘记怎样重置?

    https://blog.csdn.net/zztingfeng/article/details/80155624

  3. Ubuntu 16.04安装QQ(不一定成功)

    注意1:如果是刚新装的系统,可以正常安装,但是,如果你已经装了很多软件,千万不要安装,因为会把系统上一般的依赖包和你之前装的软件全部卸载掉!甚至将桌面Dock都会卸载!最终只能重装Ubuntu解决. ...

  4. Java中的字符

    以下内容引用自http://wiki.jikexueyuan.com/project/java/characters.html: 一般情况下,当处理字符时,使用的是原始数据类型char. 示例: ch ...

  5. Failed to execute 'toDataURL' on 'HTMLCanvasElement,在canvas.toDataURL()执行时候报错解决方案

    添加跨域条件   crossorigin="anonymous" [Redirect at origin 'http://xxx.xx.com' has been blocked ...

  6. 是男人就下100层【第四层】——Crazy贪吃蛇(2)

    在上一篇<是男人就下100层[第四层]--Crazy贪吃蛇(1)>中我们让贪吃蛇移动了起来,接下来我们来实现让贪吃蛇能够绕着手机屏幕边线移动而且能够改变方向 一.加入状态并改动代码 首先我 ...

  7. js 计算两个日期之间 相差几年几月几日

    1.计算日期差 Mine.vue <!-- 我的 --> <template> <div> <!-- 标题栏 --> <x-header :lef ...

  8. Linux学习笔记总结

    零.求人不如求已:        1. 在Linux中,文件,目录,驱动,命令,脚本都视为文件,也即一切皆file. 2.记住使用Linux 的关键就是六个字: 命令.选项.參数. 3.学会看帮助,不 ...

  9. 【spring+websocket的使用】

    一.spring配置文件Java代码 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns= ...

  10. EJB学习笔记六(EJB中的拦截器)

     1.前言 听到拦截器,预计都不陌生,尤其是在Servlet规范中,充分应用了拦截器的概念.EJB3也提供了拦截器的支持,本质上是轻量级的AOP实现.拦截器能够将多个业务方法中的通用逻辑从业务方法中抽 ...