当前位置: 首页 > news >正文

[BZOJ] 1001: [BeiJing2006]狼抓兔子

ST平面图最小割=ST平面图对偶图最短路

 

建图按边割开的边的边权建,特别地将S到T分成两个平面,设为SS和TT。

 

有一种情况是n=1或m=1,需要特殊处理。

注意到这种情况一定是一条链,边权为正,所以答案就是最远点了。

 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>

using namespace std;

inline int rd(){
  int ret=0,f=1;char c;
  while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
  while(isdigit(c))ret=ret*10+c-'0',c=getchar();
  return ret*f;
}

const int MAXN=3000000;
const int M=3000000;

struct Edge{
  int next,to,w;
}e[M<<1];
int ecnt,head[MAXN];
inline void adds(int x,int y,int w){
  e[++ecnt].next = head[x];
  e[ecnt].to = y;
  e[ecnt].w = w;
  head[x] = ecnt;
}
inline void add(int x,int y,int w){
  adds(x,y,w);adds(y,x,w);
}
struct Node{
  int id,w;
  Node(int x=0,int y=0){id=x;w=y;}
  bool operator < (const Node &rhs) const {
    return w>rhs.w;
  }
}top;
priority_queue<Node> Q;
int dis[MAXN],vis[MAXN];
void dij(int s){
  memset(dis,0x3f,sizeof(dis));
  Q.push(Node(s,0));dis[s]=0;
  while(!Q.empty()){
    top=Q.top();Q.pop();
    int mnid=top.id,mn=top.w;
    if(vis[mnid]) continue;
    if(mn!=dis[mnid])continue;vis[mnid]=1;
    for(int i=head[mnid];i;i=e[i].next){
      int v=e[i].to;
      if(dis[v]>dis[mnid]+e[i].w){
        dis[v]=dis[mnid]+e[i].w;
        Q.push(Node(v,dis[v]));
      }
    }
  }
}

int n,m,S,T;
#define id(x,y) ((((x)-1)*(m-1<<1))+(y))
int main(){
    n=rd();m=rd();
    S=n*m*2+1;T=n*m*2+2;
    int x;
    for(int i=1;i<=n;i++){
      for(int j=1;j<=m-1;j++){
        x=rd();
        if(i==1){add(id(1,j<<1),T,x);continue;}
        if(i==n){add(id(n-1,(j<<1)-1),S,x);continue;}
        add(id(i-1,(j<<1)-1),id(i,j<<1),x);
      }
    }
    for(int i=1;i<=n-1;i++){
      for(int j=1;j<=m;j++){
        x=rd();
        if(j==1){add(id(i,(j<<1)-1),S,x);continue;}
        if(j==m){add(id(i,j-1<<1),T,x);continue;}
        add(id(i,(j-1)<<1),id(i,(j<<1)-1),x);
      }
    }
    for(int i=1;i<=n-1;i++){
      for(int j=1;j<=m-1;j++){
        x=rd();
        add(id(i,(j<<1)-1),id(i,j<<1),x);
      }
    }
    dij(S);
    if(n!=1&&m!=1) return cout<<dis[T],0;
    int ans=0;
    for(int i=1;i<=n*m;i++) 
      if(dis[i]!=0x3f3f3f3f)
        ans=max(ans,dis[i]);
    cout<<ans;
    return 0;
}

 

转载于:https://www.cnblogs.com/ghostcai/p/9503890.html

相关文章:

  • 机器学习 vs. 深度学习
  • 请碟仙儿│一个区块链思想实验
  • JavaScript-Array类型
  • Jmeter压力测试、操作数据库、断言、分布式压测(添加负载机)学习笔记
  • oracle 修改字符集
  • iOS持续集成(一)——fastlane 使用
  • Python tips(
  • C#窗体越界时鼠标还能回到初始坐标位置
  • SQLServer 2014 本地机房HA+灾备机房DR解决方案
  • Java编程笔试面试题:分析下列程序的执行结果
  • 机器学习常见的优化算法
  • SQL 内连接,外连接(左外连接、右外连接)
  • 进程和任务计划
  • 文件、目录管理
  • centos7安装配置mysql5.6
  • [译] 怎样写一个基础的编译器
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Debian下无root权限使用Python访问Oracle
  • js学习笔记
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python连接Oracle
  • Python实现BT种子转化为磁力链接【实战】
  • SegmentFault 2015 Top Rank
  • 通过git安装npm私有模块
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 做一名精致的JavaScripter 01:JavaScript简介
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 昨天1024程序员节,我故意写了个死循环~
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (1)常见O(n^2)排序算法解析
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (LeetCode 49)Anagrams
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (转)四层和七层负载均衡的区别
  • (转载)Linux网络编程入门
  • .net Signalr 使用笔记
  • .net经典笔试题
  • .NET与 java通用的3DES加密解密方法
  • .sh 的运行
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [BUUCTF 2018]Online Tool(特详解)
  • [codevs 2822] 爱在心中 【tarjan 算法】
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件
  • [emuch.net]MatrixComputations(7-12)
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能
  • [Excel]如何找到非固定空白格數列的條件數據? 以月份報價表單為例
  • [Hive] INSERT OVERWRITE DIRECTORY要注意的问题
  • [HNOI2018]排列
  • [html] 动态炫彩渐变背景
  • [IE编程] 如何在IE8 下调试BHO控件/工具栏(调试Tab进程)