[UVALive 3661] Animal Run
图片加载可能有点慢,请跳过题面先看题解,谢谢
附:中文题面,[BZOJ1001]狼抓兔子
就要考联赛了,博客里题目的\(style\)都变了,几乎都是些套路啥的,这道题也比较套路
第一眼看这道题的感觉是网络流,求一个从左上角到右下角的最小割,但是点太多了,跑不过去
考虑这样一件事情:平面图转对偶图
最终的目的是要将左上角和右下角分开且代价最小,那就是求一条从左下到右上的最短路嘛
所以这里总结这样一个套路:平面图最小割\(--->\)对偶图最短路
那么这个对偶图怎么建?有两种建法:
- 最浅显易懂的,直接将原网格的点作为新图的点,将原网格的边作为新图的边,然后跑最短路,时间上是没有什么问题的,可以跑过去,但是这样跑太慢了;
- 考虑这样一种模型:将图中的三角形作为新图的点,新图中的边就是这些三角形间的公共边,这样建的话,点和边都在\(O(n*m)\)级别,跑起来会比上面那种方法快很多;
$
$
\(PS\):在\(BZOJ\)上提交这道题需要特判\(n\),\(m\)等于\(1\)的情况
$
$
//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#define N (1010)
#define M (2000010)
#define il inline
#define RG register
using namespace std;
il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();
if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }
int t,n,m,S,T,c[N][N][3];
int num,head[M],nxt[M*3],to[M*3],w[M*3];
il void add(int u,int v,int d){
nxt[++num]=head[u];to[num]=v;w[num]=d;head[u]=num;
}
il int id(int x,int y,int z){return n*m*z+x*m+y+1;}
il void init(){
S=0,T=2*n*m+2; num=0; memset(head,0,sizeof(head));
for(RG int i=0;i<n;i++) for(RG int j=0;j<m-1;j++) c[i][j][0]=gi();
for(RG int i=0;i<n-1;i++) for(RG int j=0;j<m;j++) c[i][j][1]=gi();
for(RG int i=0;i<n-1;i++) for(RG int j=0;j<m-1;j++) c[i][j][2]=gi();
for(RG int i=0;i<n-1;i++)
for(RG int j=0;j<m-1;j++){
int x=id(i,j,0);//左下角的三角形
if(j) add(x,id(i,j-1,1),c[i][j][1]);
if(i<n-1) add(x,id(i+1,j,1),c[i+1][j][0]);
int y=id(i,j,1);//右上角的三角形
if(i) add(y,id(i-1,j,0),c[i][j][0]);
if(j<m-1) add(y,id(i,j+1,0),c[i][j+1][1]);
add(x,y,c[i][j][2]); add(y,x,c[i][j][2]);
}
for(RG int i=0;i<n-1;i++) add(S,id(i,0,0),c[i][0][1]);
for(RG int j=0;j<m-1;j++) add(S,id(n-2,j,0),c[n-1][j][0]);
for(RG int i=0;i<n-1;i++) add(id(i,m-2,1),T,c[i][m-1][1]);
for(RG int j=0;j<m-1;j++) add(id(0,j,1),T,c[0][j][0]);
}//设S为左下的起点,T为右上的起点
int dis[M];
bool vis[M];
struct node{int x,dis;
bool operator<(const node& a)const{return dis>a.dis;}
};
priority_queue<node>que;
void Dij(){
memset(vis,0,sizeof(vis));
memset(dis,127/3,sizeof(dis));
dis[0]=0; que.push((node){0,0});
while(!que.empty()){
int x=que.top().x; que.pop();
if(vis[x]) continue;
for(int i=head[x];i;i=nxt[i]){
int v=to[i];
if(dis[v]>dis[x]+w[i]){
dis[v]=dis[x]+w[i];
que.push((node){v,dis[v]});
}
}
vis[x]=1;
}
}
il void work(){ Dij(); printf("Case %d: Minimum = %d\n",++t,dis[T]); }
int main(){ while(scanf("%d%d",&n,&m)&&n){ init(); work(); } return 0; }
[UVALive 3661] Animal Run的更多相关文章
- UVALive 3661 Animal Run(最短路解最小割)
题意:动物要逃跑,工作人员要截断从START(左上角)到END(右下角)的道路,每条边权表示拦截该条道路需要多少工作人员.问最少需要多少人才能完成拦截. 通俗地讲,就是把图一分为二所造成消耗的最小值. ...
- UVA1376.Animal Run (最小割转为最短路 && dijkstra)
Animal Run Time Limit:6000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status ...
- BZOJ 1001 [BeiJing2006]狼抓兔子 (UVA 1376 Animal Run)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 24727 Solved: 6276[Submit][ ...
- Java 浅析三大特性之一多态
Java 浅析三大特性之一多态 之前我们的文章讲了Java的封装和继承,封装讲的时候,并没有体现出来封装的强大之处,反而还要慎用封装.因为这时的封装还没有和多态联系到一起,还无法看出向上转型的厉害之处 ...
- Java 浅析三大特性之一继承
上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言.Java实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...
- python基础之面对对象
Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触 ...
- Python学习笔记 for windows 二
函数 abs(-20) //结果为:20,绝对值函数 def 函数名称([参数1,参数2,参数3]): 执行语句 retu ...
- 培训第五天---JS
&&与||的基础<script type="text/javascript"> var c = 4||3; alert(c);</script&g ...
- 通过JavaScript原型链理解基于原型的编程
零.此文动机 用了一段时间的Lua,用惯了Java C++等有Class关键字的语言,一直对Lua的中的面向对象技术感到费解,一个开源的objectlua更是看了n遍也没理解其中的原理,直到看到了Pr ...
随机推荐
- linux的convert图片处理工具
得到一个图片的尺寸, identify test.png 结果为: test.png PNG 178x15 178x15+0+0 16-bit PseudoClass 65536c 2.28kb 使用 ...
- 使用while和read命令读取文件内容
转:使用while和read命令读取文件内容 1.准备数据文件 $cat a.txt 200:2 300:3 400:4 500:5 2.用while循环从文件中读取数据 #!/bin/ksh whi ...
- 案例学python——案例二:连接数据库MySql
调侃的话:案例一跑完之后,欣赏把玩了一番.人就有点飘飘然,昨天除了做饭吃饭,就是玩三国杀,江郎才尽,今天周一,不飘了,敲点代码,看看Python操作数据库有啥不一样的. 前期准备: 1.数据库 电脑上 ...
- 以英雄联盟的方式建模,谈对依赖注入(DI)的理解以及Autofac的用法(一)
一.前言 近期在探索分层架构和架构设计,选择了领域驱动作为5年.Net开发后的新的方向,不可避免的接触了IoC/DI方面的技术.目前通过反射或其他方法都已实现,但只知其一,并没有考虑为什么要这么做,同 ...
- 开启mac上印象笔记的代码块
Mac 印象笔记左上角菜单栏:偏好设置-->软件更新-->开启代码块 (Preferences -> Software Update -> Enable code block) ...
- SpringBoot日记——分布式篇
思考:什么是分布式?什么是微服务? 一些概念:RPC-远程过程调用,某台机器想要调用另一台机器所需要的一种服务,及分布式的服务框架,比如dubbo或者SpringCloud. 铺天盖地的分布式互联网系 ...
- 一文让你完全弄懂Stegosaurus
国内关于 Stegosaurus 的介绍少之又少,一般只是单纯的工具使用的讲解之类的,并且本人在学习过程中也是遇到了很多的问题,基于此种情况下写下此文,也是为我逝去的青春时光留个念想吧~ Stegos ...
- grep精确匹配搜索某个单词的用法 (附: grep高效用法小结))
grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正 ...
- WinForm多线程+委托防止界面假死
当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Generic ...
- 基于SSH框架的考勤管理系统的设计与实现
基于SSH框架的考勤管理系统的设计与实现