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


附:中文题面,[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; }

[UVALive 3661] Animal Run的更多相关文章

  1. UVALive 3661 Animal Run(最短路解最小割)

    题意:动物要逃跑,工作人员要截断从START(左上角)到END(右下角)的道路,每条边权表示拦截该条道路需要多少工作人员.问最少需要多少人才能完成拦截. 通俗地讲,就是把图一分为二所造成消耗的最小值. ...

  2. UVA1376.Animal Run (最小割转为最短路 && dijkstra)

    Animal Run Time Limit:6000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status ...

  3. BZOJ 1001 [BeiJing2006]狼抓兔子 (UVA 1376 Animal Run)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 24727  Solved: 6276[Submit][ ...

  4. Java 浅析三大特性之一多态

    Java 浅析三大特性之一多态 之前我们的文章讲了Java的封装和继承,封装讲的时候,并没有体现出来封装的强大之处,反而还要慎用封装.因为这时的封装还没有和多态联系到一起,还无法看出向上转型的厉害之处 ...

  5. Java 浅析三大特性之一继承

    上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言.Java实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...

  6. python基础之面对对象

    Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触 ...

  7. Python学习笔记 for windows 二

    函数 abs(-20)                                        //结果为:20,绝对值函数 def 函数名称([参数1,参数2,参数3]): 执行语句 retu ...

  8. 培训第五天---JS

    &&与||的基础<script type="text/javascript"> var c = 4||3; alert(c);</script&g ...

  9. 通过JavaScript原型链理解基于原型的编程

    零.此文动机 用了一段时间的Lua,用惯了Java C++等有Class关键字的语言,一直对Lua的中的面向对象技术感到费解,一个开源的objectlua更是看了n遍也没理解其中的原理,直到看到了Pr ...

随机推荐

  1. odoo在底部显示指定字段合计和汇总时显示合计

    1.odoo的tree视图底部显示合计 tree 视图,底部显示指定字段合计数 ,视图中字段定义上在sum,取自sale.view_order_tree 销售订单 tree 视图 <field ...

  2. NPOI导Excel样式设置

    一.创建一个Excel //创建一个工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); //创建一个页 ISheet sheet = workbook.Cr ...

  3. Jquery UI 中的datepicker() ,获取日期后的回调函数onClose()

    <head> //引入相关的css/js <link rel="stylesheet" href="//code.jquery.com/ui/1.10. ...

  4. HDU 6165 FFF at Valentine

    题目大意:给出一个有向图,问你这个图中是否对于任意两点\(u,v\),都至少满足\(u\to v\)(\(u\)可到达\(v\),下同)或\(v\to u\)中的一个. 一看就是套路的图论题,我们先把 ...

  5. Tomcat通过自带的Cluster方式实现Session会话共享环境操作记录

    一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到session以至于最终导致请求失败.要 ...

  6. C_数据结构_链式二叉树

    # include <stdio.h> # include <malloc.h> struct BTNode { int data; struct BTNode * pLchi ...

  7. Let the Balloon Rise HDU水题

    题意 让你统计字符串最多的那个串,并输出 分析 直接用map统计,不断更新最大值即可 代码 #include<iostream> #include<algorithm> #in ...

  8. 【软件工程Ⅱ】作业二 |分布式版本控制系统Git的安装与使用

    本次作业的要去来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 远程库地址:https://github.com/Mol ...

  9. PAT 1061 判断题

    https://pintia.cn/problem-sets/994805260223102976/problems/994805268817231872 判断题的评判很简单,本题就要求你写个简单的程 ...

  10. Expanded encryption and decryption signature algorithm SM2 & SM3

    Expanded encryption and decryption signature algorithm supports multiple signature digest algorithms ...