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. Treasure Hunt--poj1066(最短路加判断线段的关系)

    http://poj.org/problem?id=1066 题目大意:有n条线段 他们都在这个房间里   最后有一个点代表起始位置 现在想通过墙出去  他只能爆破每个房间的中点的门   问最少的门通 ...

  2. poj 3041——Asteroids

    poj       3041——Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22604   Accep ...

  3. java基础语法1

    一:基础语法之--标识符,修饰符,关键字 1.标识符: 定义:类名.变量名以及方法名都被称为标识符.自定义的名字. 注意: ·所有的标识符都应该以字母(A-Z或者a-z),美元符($).或者下划线(_ ...

  4. web应用启动的时候SpringMVC容器加载过程

    <!-- 配置DispatcherServlet --> <servlet> <servlet-name>springmvc</servlet-name> ...

  5. 109.Convert sorted list to BST

    /* * 109.Convert sorted list to BST * 2016.12.24 by Mingyang * 这里的问题是对于一个链表我们是不能常量时间访问它的中间元素的. * 这时候 ...

  6. Java 函数式接口 lambda

    import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class Demo1 { ...

  7. 国内代码托管平台(Git和SVN)

        Github(Git和SVN)https://github.com/ 可以说GitHub的出现完全颠覆了以往大家对代码托管网站的认识.GitHub不但是一个代码托管网站,更是一个程序员的SNS ...

  8. CTEX - 在线文档 - TeX/LaTeX 常用宏包

    CTEX - 在线文档 - TeX/LaTeX 常用宏包       页面与章节标题式样   浮动对象及标题设计   生成与插入图形   表格与列表   目录与索引   参考文献   数学与化学公式 ...

  9. 解决安装oracle11g r2时提示pdksh conflicts with ksh-20100621-2.el6.i686问题

    http://blog.csdn.net/linghao00/article/details/7943740 http://www.2cto.com/os/201306/218566.html 在Ce ...

  10. ZOJ 3316 Game 一般图最大匹配带花树

    一般图最大匹配带花树: 建图后,计算最大匹配数. 假设有一个联通块不是完美匹配,先手就能够走那个没被匹配到的点.后手不论怎么走,都必定走到一个被匹配的点上.先手就能够顺着这个交错路走下去,最后一定是后 ...