图片加载可能有点慢,请跳过题面先看题解,谢谢


附:中文题面,[BZOJ1001]狼抓兔子
就要考联赛了,博客里题目的\(style\)都变了,几乎都是些套路啥的,这道题也比较套路
第一眼看这道题的感觉是网络流,求一个从左上角到右下角的最小割,但是点太多了,跑不过去
考虑这样一件事情:平面图转对偶图
最终的目的是要将左上角和右下角分开且代价最小,那就是求一条从左下到右上的最短路嘛
所以这里总结这样一个套路:平面图最小割\(--->\)对偶图最短路
那么这个对偶图怎么建?有两种建法:

  1. 最浅显易懂的,直接将原网格的点作为新图的点,将原网格的边作为新图的边,然后跑最短路,时间上是没有什么问题的,可以跑过去,但是这样跑太慢了;
  2. 考虑这样一种模型:将图中的三角形作为新图的点,新图中的边就是这些三角形间的公共边,这样建的话,点和边都在\(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相关推荐

  1. UVA 1376 Animal Run 最短路

    平面图最小割转最短路 书上是说以边为结点建图 但是我觉得好像以每块空白区域为结点建图会更自然点.把矩形的右上方编号为0,左下方编号为1,分别为起点终点 //#pragma comment(linker ...

  2. 《题目与解读》红书 训练笔记目录《ACM国际大学生程序设计竞赛题目与解读》

    虽然2012年出版的老书了,但是是由三次世界冠军的上海交大ACM队出版的书籍,选择的题目是ACM经典中的经典,书中有非常详细的题解,可以学到很多东西,值得一刷. 目录 第一部分 第一章 数学 1.1 ...

  3. 第二十五章 面向对象------封装、内置函数、反射、动态导入

    1.封装 什么是封装? 1.对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口 注意:封装有隐藏的意思,但不是单纯的隐藏 学习封装的目的:就是为了能够限制外界对内部数据的访问 python中属性 ...

  4. NDK开发 - C/C++ 访问 Java 变量和方法

    上一篇有提到 JNI 访问引用数组,涉及了 C/C++ 访问 Java 实例的方法和变量.虽然在之前的开发中,并没有用到 C/C++ 范围 Java 层数据,但是这部分内容还是很有用的. 传送门:ND ...

  5. python3 面向对象(一)

    以Student类为例,定义类通过 class 关键字 class Student(object):pass class 后面紧接着是类名,即 Student,类名通常是大写开头的单词,紧接着是 (o ...

  6. 刻意练习:Python基础 -- Task10. 类与对象

    背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...

  7. 何为Java 中的多态?

    Java 中的多态一般分为两种:重写式多态和重载式多态. 重载式多态,也叫编译时多态.也就是说这种多态再编译时已经确定好了.重载大家都知道,方法名相同而参数列表不同的一组方法就是重载.在调用这种重载的 ...

  8. python有什么用处案例_用实例解释Python中的继承和多态的概念

    在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Supe ...

  9. python 继承和多态

    python 继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Ba ...

最新文章

  1. Your First Concordion.Net Project (Part 5)-Running Specs with Gallio
  2. 选择排序由浅到深详细分析和图解
  3. 网易汪源: 网易云将如何激活 互联网+产业 深度融合
  4. 苹果降低应用商店收入一半分成、Twitter视频分享功能 Fleet、百度36亿美元收购 YY|Decode the Week...
  5. 6个经典的JavaScript报错分析
  6. 5加载stm32 keil_STM32在SRAM、FLASH中调试代码的配置方法(附详细步骤)
  7. java 算数运算符
  8. Linux开发_调试与安全_gdb_peda简介
  9. 多图片的合并(2种方式,可以设置间距)
  10. iPhone为何优越过 Android呢
  11. solr5.5.3+tomcat8部署
  12. 区块链技术原理-分布式数据库
  13. python批量修改图片格式、重命名
  14. 搭建个人网盘-owncloud
  15. 吴恩达-机器学习-多元线性回归模型代码
  16. 斐波那契数列与数列求和
  17. 如何将支付宝小程序迁移至微信/FinClip运行
  18. Web 前端必会的 PhotoShop 技能
  19. 动规 - 最大子矩阵问题
  20. spring data jpa使用的几种方式

热门文章

  1. 面向对象,面向服务,面向组件三种编程模式有什么区别
  2. 位置服务器的操作方法,hpproliantml系列服务器上机架操作方法.doc.docx
  3. java 内存跟踪_详解JVM中的本机内存跟踪
  4. oracle job 每月前十天运行_Tensorflow源码解析7 -- TensorFlow分布式运行时
  5. 【kafka】kafka 如何查看 内部 磁盘 网络 是否繁忙
  6. 【Redis】Redis 使用 redisson 做分布式锁 复盘 maven 依赖 netty 冲突
  7. 【clickhouse】flink clickhouse sink Class.forName 卡死
  8. 【MySQL】MySQL 执行 PROCEDURE ANALYSE 报错 ERROR 1064 (42000)
  9. hortonworks/registry : ClassNotFoundException: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
  10. 95-090-022-源码-bin脚本-CLI提交Job的时候加载插件