[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; }
转载于:https://www.cnblogs.com/Hero-of-someone/p/7751617.html
[UVALive 3661] Animal Run相关推荐
- UVA 1376 Animal Run 最短路
平面图最小割转最短路 书上是说以边为结点建图 但是我觉得好像以每块空白区域为结点建图会更自然点.把矩形的右上方编号为0,左下方编号为1,分别为起点终点 //#pragma comment(linker ...
- 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》
虽然2012年出版的老书了,但是是由三次世界冠军的上海交大ACM队出版的书籍,选择的题目是ACM经典中的经典,书中有非常详细的题解,可以学到很多东西,值得一刷. 目录 第一部分 第一章 数学 1.1 ...
- 第二十五章 面向对象------封装、内置函数、反射、动态导入
1.封装 什么是封装? 1.对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口 注意:封装有隐藏的意思,但不是单纯的隐藏 学习封装的目的:就是为了能够限制外界对内部数据的访问 python中属性 ...
- NDK开发 - C/C++ 访问 Java 变量和方法
上一篇有提到 JNI 访问引用数组,涉及了 C/C++ 访问 Java 实例的方法和变量.虽然在之前的开发中,并没有用到 C/C++ 范围 Java 层数据,但是这部分内容还是很有用的. 传送门:ND ...
- python3 面向对象(一)
以Student类为例,定义类通过 class 关键字 class Student(object):pass class 后面紧接着是类名,即 Student,类名通常是大写开头的单词,紧接着是 (o ...
- 刻意练习:Python基础 -- Task10. 类与对象
背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...
- 何为Java 中的多态?
Java 中的多态一般分为两种:重写式多态和重载式多态. 重载式多态,也叫编译时多态.也就是说这种多态再编译时已经确定好了.重载大家都知道,方法名相同而参数列表不同的一组方法就是重载.在调用这种重载的 ...
- python有什么用处案例_用实例解释Python中的继承和多态的概念
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...
- python 继承和多态
python 继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Ba ...
最新文章
- Your First Concordion.Net Project (Part 5)-Running Specs with Gallio
- 选择排序由浅到深详细分析和图解
- 网易汪源: 网易云将如何激活 互联网+产业 深度融合
- 苹果降低应用商店收入一半分成、Twitter视频分享功能 Fleet、百度36亿美元收购 YY|Decode the Week...
- 6个经典的JavaScript报错分析
- 5加载stm32 keil_STM32在SRAM、FLASH中调试代码的配置方法(附详细步骤)
- java 算数运算符
- Linux开发_调试与安全_gdb_peda简介
- 多图片的合并(2种方式,可以设置间距)
- iPhone为何优越过 Android呢
- solr5.5.3+tomcat8部署
- 区块链技术原理-分布式数据库
- python批量修改图片格式、重命名
- 搭建个人网盘-owncloud
- 吴恩达-机器学习-多元线性回归模型代码
- 斐波那契数列与数列求和
- 如何将支付宝小程序迁移至微信/FinClip运行
- Web 前端必会的 PhotoShop 技能
- 动规 - 最大子矩阵问题
- spring data jpa使用的几种方式
热门文章
- 面向对象,面向服务,面向组件三种编程模式有什么区别
- 位置服务器的操作方法,hpproliantml系列服务器上机架操作方法.doc.docx
- java 内存跟踪_详解JVM中的本机内存跟踪
- oracle job 每月前十天运行_Tensorflow源码解析7 -- TensorFlow分布式运行时
- 【kafka】kafka 如何查看 内部 磁盘 网络 是否繁忙
- 【Redis】Redis 使用 redisson 做分布式锁 复盘 maven 依赖 netty 冲突
- 【clickhouse】flink clickhouse sink Class.forName 卡死
- 【MySQL】MySQL 执行 PROCEDURE ANALYSE 报错 ERROR 1064 (42000)
- hortonworks/registry : ClassNotFoundException: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
- 95-090-022-源码-bin脚本-CLI提交Job的时候加载插件