题意

https://www.lydsy.com/JudgeOnline/problem.php?id=2007

思路

首先可以发现一个结论,每个位置的海拔只有能是 \(0\) 和 \(1\) ,然后这道题就是求以人流量为边权的最小割。

直接用网络流求最小割似乎会T 。但这张图是个平面图,可以转化成它的对偶图求最短路,唯一要注意的一点是,这张无向图每条边正走和反走边权是不同的,于是转化对偶图的时候把每条边逆时针翻转 \(90\) 度即可,正确性讲不清楚,需要感性理解。

代码

#include<bits/stdc++.h>
#define FOR(i,x,y) for(int i=(x),i##END=(y);i<=i##END;++i)
#define DOR(i,x,y) for(int i=(x),i##END=(y);i>=i##END;--i)
template<typename T,typename _T>inline bool chk_min(T &x,const _T y){return y<x?x=y,1:0;}
template<typename T,typename _T>inline bool chk_max(T &x,const _T y){return x<y?x=y,1:0;}
typedef long long ll;
const int N=505;
template<const int N,const int M,typename T>struct LinkedList
{
int head[N],nxt[M],tot;T to[M];
LinkedList(){clear();}
T &operator [](const int x){return to[x];}
void clear(){memset(head,-1,sizeof(head)),tot=0;}
void add(int u,T v){to[tot]=v,nxt[tot]=head[u],head[u]=tot++;}
#define EOR(i,G,u) for(int i=G.head[u];~i;i=G.nxt[i])
};
template<typename T>struct Heap
{
T a[4*N*N];int n;
Heap(){clear();}
void clear(){n=0;}
bool empty(){return n==0;}
T top(){return a[1];}
void push(T val)
{
int x=++n;
for(int y;(y=(x>>1));x=y)
{
if(val<a[y])a[x]=a[y];
else break;
}
a[x]=val;
}
void pop()
{
int x=1;T val=a[n--];
for(int y;(y=(x<<1))<=n;x=y)
{
if(y+1<=n&&a[y+1]<a[y])y++;
if(a[y]<val)a[x]=a[y];
else break;
}
a[x]=val;
}
};
struct edge{int to,cost;};
struct node
{
int at,path;
bool operator <(const node &_)const{return path<_.path;}
}; LinkedList<N*N,4*N*N,edge>G;
Heap<node>H;
int dis[N*N];
int n,S,T; inline int Hs(int x,int y)
{
if(y<1||x>n)return S;
if(y>n||x<1)return T;
return (x-1)*n+y;
} int dijkstra()
{
FOR(i,1,T)dis[i]=1e9;
H.clear();
H.push((node){S,dis[S]=0});
while(!H.empty())
{
node now=H.top();H.pop();
int u=now.at;
if(dis[u]<now.path)continue;
EOR(i,G,u)
{
int v=G[i].to,w=G[i].cost;
if(chk_min(dis[v],dis[u]+w))
H.push((node){v,dis[v]});
}
}
return dis[T];
} int main()
{
scanf("%d",&n);
S=n*n+1,T=n*n+2;
FOR(i,1,n+1)FOR(j,1,n)
{
int w;scanf("%d",&w);
G.add(Hs(i,j),(edge){Hs(i-1,j),w});
}
FOR(i,1,n)FOR(j,0,n)
{
int w;scanf("%d",&w);
G.add(Hs(i,j),(edge){Hs(i,j+1),w});
}
FOR(i,0,n)FOR(j,1,n)
{
int w;scanf("%d",&w);
G.add(Hs(i,j),(edge){Hs(i+1,j),w});
}
FOR(i,1,n)FOR(j,1,n+1)
{
int w;scanf("%d",&w);
G.add(Hs(i,j),(edge){Hs(i,j-1),w});
}
printf("%d\n",dijkstra());
return 0;
}

NOI 2010 海拔(最小割转最短路)的更多相关文章

  1. BZOJ.2007.[NOI2010]海拔(最小割 对偶图最短路)

    题目链接 想一下能猜出,最优解中海拔只有0和1,且海拔相同的点都在且只在1个连通块中. 这就是个平面图最小割.也可以转必须转对偶图最短路,不然只能T到90分了..边的方向看着定就行. 不能忽略回去的边 ...

  2. 【bzoj2007】[Noi2010]海拔 最小割+对偶图+最短路

    题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交 ...

  3. bzoj 2007 [Noi2010]海拔——最小割转最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2007 一个点的高度一定不是0就是1.答案一定形如一个左上角的连通块全是0的点.一个右下角的连 ...

  4. NOI 2010 海拔 ——平面图转对偶图

    [题目分析] 可以知道,所有的海拔是0或1 最小割转最短路,就可以啦 SPFA被卡,只能换DIJ [代码] #include <cstdio> #include <cstring&g ...

  5. 【BZOJ1001】狼抓兔子(平面图最小割转最短路)

    题意:有一张平面图,求它的最小割.N,M.表示网格的大小,N,M均小于等于1000. 左上角点为(1,1),右下角点为(N,M).有以下三种类型的道路  1:(x,y)<==>(x+1,y ...

  6. 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2095  Solved: 1002[Submit][Status] ...

  7. P2046 [NOI2010]海拔 平面图转对偶图(最小割-》最短路)

    $ \color{#0066ff}{ 题目描述 }$ YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形. ...

  8. Luogu2046 NOI2010 海拔 平面图、最小割、最短路

    传送门 首先一个不知道怎么证的结论:任意点的\(H\)只会是\(0\)或\(1\) 那么可以发现原题的本质就是一个最小割,左上角为\(S\),右下角为\(T\),被割开的两个部分就是\(H=0\)与\ ...

  9. HDU3870 Catch the Theves(平面图最小割转最短路)

    题目大概说给一个n×n的方格,边有权值,问从求(1,1)到(n,n)的最小割. 点达到了160000个,直接最大流不好.这题的图是平面图,求最小割可以转化成求其对偶图的最短路,来更高效地求解: 首先源 ...

随机推荐

  1. 使用yarn来替代npm

    Yarn是由Facebook.Google.Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具 ,正如官方文档中写的,Yarn 是为了弥补 npm 的一些缺陷而出现的 安装yarn ...

  2. Kubernetes 有状态与无状态介绍

    Kubernetes 有状态与无状态介绍 无状态:deployment - 认为所有pod都是一样的,不具备与其他实例有不同的关系. - 没有顺序的要求. - 不用考虑再哪个Node运行. - 随意扩 ...

  3. Kubernetes 静态PV使用

    Kubernetes  静态PV使用 Kubernetes支持持久卷的存储插件:https://kubernetes.io/docs/concepts/storage/persistent-volum ...

  4. Installing on Kubernetes with NATS Operator

    https://github.com/nats-io/nats-operator https://hub.helm.sh/charts/bitnami/nats https://github.com/ ...

  5. Linux磁盘系统——管理磁盘的命令

    Linux磁盘系统——管理磁盘的命令 摘要:本文主要学习了Linux系统中管理磁盘的命令,包括查看磁盘使用情况.磁盘挂载相关.磁盘分区相关.磁盘格式化等操作. df命令 df命令用于显示Linux系统 ...

  6. scrapy框架抓取表情包/(python爬虫学习)

    抓取网址:https://www.doutula.com/photo/list/?page=1 1.创建爬虫项目:scrapy startproject biaoqingbaoSpider 2.创建爬 ...

  7. Java实现贪吃蛇游戏(含账号注册登录,排行榜功能)

    这是我第一次工程实践的作业,选题很多,但我只对其中的游戏开发感兴趣,可游戏就两三个类型,最终还是选择了贪吃蛇.其实就贪吃蛇本身的代码实现还算是比较简单的,可是实践要求代码行达到一定数量,所以我就额外给 ...

  8. centos7 升级php7 添加配置epel源 报错:Cannot retrieve metalink for repository: epel. Please verify its path and try again

    文章来自:循序渐渐linux:基础知识 一书 7.3章LAMP服务器搭建 日常故障 centos上好多软件升级需要配置epel源 其中有一点小插曲 需要手动更改 1.很多时候,对PHP环境要求较新的版 ...

  9. (七)OpenStack---M版---双节点搭建---Dashboard安装和配置

    ↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 1.安装并配置 2.重启apache和memcached服务 3.验证 4.在Web界面创建网络 ...

  10. 如何在Etherscan.io 部署ETH以太坊智能合约 如何在15分钟内创建你的加密货币

    一.概述 ETH 网络这里就不介绍了,这篇文章主要记录在以太坊主网和测试网络部署一个智能合约,也就是如何发币. 二.部署合约需要的生产工具      准备工具前,建议大家准备个VPN,因为会访问国外网 ...