BZOJ 1001 [BeiJing2006]狼抓兔子 (UVA 1376 Animal Run)
1001: [BeiJing2006]狼抓兔子
Time Limit: 15 Sec Memory Limit: 162 MB
Submit: 24727 Solved: 6276
[Submit][Status][Discuss]
Description

Input
Output
输出一个整数,表示参与伏击的狼的最小数量.
Sample Input
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
Source
题目大意:在一个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)的更多相关文章
- BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)
题目大意 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的.而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- BZOJ 1001: [BeiJing2006]狼抓兔子
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 20029 Solved: 4957[Submit][ ...
- BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 23822 Solved: 6012[Submit][ ...
- BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)
平面图的最小割转化为对偶图的最短路(资料:两极相通——浅析最大最小定理在信息学竞赛中的应用) ,然后DIJKSTRA就OK了. ------------------------------------ ...
- BZOJ 1001: [BeiJing2006]狼抓兔子 最小割
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓 ...
- [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- 【刷题】BZOJ 1001 [BeiJing2006]狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割
平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割 找到最小环(即最短路)极为所求,注意辅助边的建立 加入读入优化 不过时间还是一般 估计是dij写的不好 大神勿喷~~~ /*** ...
- BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 题意: 思路:这道题目是最小割题目,但是吧你直接套用Dinic是会超时的. 这里有种很奇妙的做 ...
随机推荐
- ZOJ 1232 【灵活运用FLOYD】 【图DP】
题意: copy自http://blog.csdn.net/monkey_little/article/details/6637805 有A个村子和B个城堡,村子标号是1~A,城堡标号是A+1~B.马 ...
- maven之基础
一.配置maven的环境 下载地址:http://maven.apache.org/download.cgi(window下载(Binary zip)的) 将maven解压,然后配置环境变量打开: 计 ...
- python统一的换行符,实现跨平台
6 PEP 278: Universal Newline Support The three major operating systems used today are Microsoft Wind ...
- Android c/c++ 应用向linux 平台迁移执行
鉴于近期在minicamera (linux + FPGA) 平台上模拟 安卓系统camera流程遭遇不断升级同步的困扰.尤其是 不开放源代码后 , 应用要链接封闭动态库造成的困难.以及在sprdis ...
- OUTPUT 子句
除了修改数据以外,一般不会希望修改语句后再做其他事情.也就是说,一般不会希望修改语句能够返回任何输出.然而,在有些场合下,能够从修改过的行中返回数据,这个功能可能也有一定的用处. 例如,考虑UPDAT ...
- PHP开发者实用的代码
一.查看邮件是否已被阅读 当你在发送邮件时,你或许很想知道该邮件是否被对方已阅读.这里有段非常有趣的代码片段能够显示对方IP地址记录阅读的实际日期和时间. <? error_reporting( ...
- Navicat for MySQL出现1030-Got error 28 from storage engine错误
Navicat for MySQL出现1030-Got error 28 from storage engine错误 刚刚还能用这会儿就用不了了,估计是磁盘空间不足引起的! 在根目录/下执行命令:d ...
- Xcode The identity used to sign the executable is no longer valid. 错误解决
Xcode真机调试时出现问题:Xcode The identity used to sign the executable is no longer valid. Please verify that ...
- test_action
[TOP] 为什么百度校招数据挖掘工程师的笔试题目是跟数据挖掘关系不大? - 研究生生活交流 - 王道论坛,专注于计算机考研的点点滴滴! http://www.cskaoyan.com/thread- ...
- js事件绑定/监听
事件绑定/监听的方法 1.直接绑定 顾名思义,直接在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.on ...