传送门


首先一个不知道怎么证的结论:任意点的\(H\)只会是\(0\)或\(1\)

那么可以发现原题的本质就是一个最小割,左上角为\(S\),右下角为\(T\),被割开的两个部分就是\(H=0\)与\(H=1\)的部分

直接上Dinic似乎有90pts

然后可以发现原图是一个经典的平面图

于是将平面图最小割转化成对偶图最短路模型,然后堆优化Dijkstra即可。

关于平面图最小割转化为对偶图最短路可以看这个

#include<bits/stdc++.h>
#define id(i , j) (((i) - 1) * N + (j))
#define INF 0x3f3f3f3f
#define st first
#define nd second
#define PII pair < int , int >
//This code is written by Itst
using namespace std; inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c) && c != EOF){
if(c == '-')
f = 1;
c = getchar();
}
if(c == EOF)
exit(0);
while(isdigit(c)){
a = (a << 3) + (a << 1) + (c ^ '0');
c = getchar();
}
return f ? -a : a;
} const int MAXN = 255010 , MAXM = 2050010;
struct Edge{
int end , upEd , w;
}Ed[MAXM];
int head[MAXN] , dis[MAXN];
int N , S , T , cntEd = 1;
priority_queue < PII > q; inline void addEd(int a , int b , int c){
Ed[++cntEd].end = b;
Ed[cntEd].upEd = head[a];
Ed[cntEd].w = c;
head[a] = cntEd;
} inline void Dijk(){
memset(dis , 0x3f , sizeof(dis));
dis[S] = 0;
q.push(PII(0 , S));
while(!q.empty()){
PII t = q.top();
q.pop();
if(-t.st > dis[t.nd])
continue;
if(t.nd == T)
return;
for(int i = head[t.nd] ; i ; i = Ed[i].upEd)
if(dis[Ed[i].end] > dis[t.nd] + Ed[i].w){
dis[Ed[i].end] = dis[t.nd] + Ed[i].w;
q.push(PII(-dis[Ed[i].end] , Ed[i].end));
}
}
} void input(){
N = read();
T = id(N , N) + 1;
for(int i = 0 ; i <= N ; ++i)
for(int j = 1 ; j <= N ; ++j){
int k = read();
if(i == 0)
addEd(S , id(i + 1 , j) , k);
else
if(i == N)
addEd(id(i , j) , T , k);
else
addEd(id(i , j) , id(i + 1 , j) , k);
}
for(int i = 1 ; i <= N ; ++i)
for(int j = 0 ; j <= N ; ++j){
int k = read();
if(j == 0)
addEd(id(i , j + 1) , T , k);
else
if(j == N)
addEd(S , id(i , j) , k);
else
addEd(id(i , j + 1) , id(i , j) , k);
}
for(int i = 0 ; i <= N ; ++i)
for(int j = 1 ; j <= N ; ++j){
int k = read();
if(i && i != N)
addEd(id(i + 1 , j) , id(i , j) , k);
}
for(int i = 1 ; i <= N ; ++i)
for(int j = 0 ; j <= N ; ++j){
int k = read();
if(j && j != N)
addEd(id(i , j) , id(i , j + 1) , k);
}
} void work(){
Dijk();
cout << dis[T];
} int main(){
#ifndef ONLINE_JUDGE
freopen("in" , "r" , stdin);
//freopen("out" , "w" , stdout);
#endif
input();
work();
return 0;
}

Luogu2046 NOI2010 海拔 平面图、最小割、最短路的更多相关文章

  1. Vijos1734 NOI2010 海拔 平面图最小割

    建立平面图的对偶图,把最小割转化成最短路问题 Dijkstra算法堆优化 (被输入顺序搞WA了好几次T_T) #include <cstdio> #include <cstring& ...

  2. bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)

    bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路) 题目描述: bzoj  luogu 题解时间: 首先考虑海拔待定点的$h$都应该是多少 很明显它们都是$0$或$1$,并且所 ...

  3. BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路

    问题描述 BZOJ2007 LG2046 题解 发现左上角海拔为 \(0\) ,右上角海拔为 \(1\) . 上坡要付出代价,下坡没有收益,所以有坡度的路越少越好. 所以海拔为 \(1\) 的点,和海 ...

  4. BZOJ 2007 海拔(平面图最小割转对偶图最短路)

    首先注意到,把一个点的海拔定为>1的数是毫无意义的.实际上,可以转化为把这些点的海拔要么定为0,要么定为1. 其次,如果一个点周围的点的海拔没有和它相同的,那么这个点的海拔也是可以优化的,即把这 ...

  5. bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...

  6. BZOJ 2007 海拔(平面图最小割-最短路)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2007 题意:给出一个n*n的格子,那么顶点显然有(n+1)*(n+1)个.每两个相邻顶点 ...

  7. 洛谷P2046 [NOI2010]海拔(最小割,平面图转对偶图)

    传送门 不明白为什么大佬们一眼就看出这是最小割…… 所以总而言之这就是一个最小割我也不知道为什么 然后边数太多直接跑会炸,所以要把平面图转对偶图,然后跑一个最短路即可 至于建图……请看代码我实在无能为 ...

  8. bzoj 2007: [Noi2010]海拔【最小割+dijskstra】

    上来就跑3e5的最大流--脑子抽了 很容易看出,每个地方的海拔都是0或1因为再高了没有意义,又,上去下来再上去没有意义,所以最后一定是从s连着一片0,剩下连着t一片1,然后有贡献的就是01交接的那些边 ...

  9. 【BZOJ2007】【NOI2010】海拔(最小割,平面图转对偶图,最短路)

    [BZOJ2007][NOI2010]海拔(最小割,平面图转对偶图,最短路) 题面 BZOJ 洛谷 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域. ...

随机推荐

  1. Gitlab--安装及汉化

    简介 gitlab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git 项目仓库,可通过Web界面迚行访问公开的戒者私人项目.Ruby on Rails 是一个可以使你开 ...

  2. 【Java入门提高篇】Day32 Java容器类详解(十四)ArrayDeque详解

    今天来介绍一个不太常见也不太常用的类——ArrayDeque,这是一个很不错的容器类,如果对它还不了解的话,那么就好好看看这篇文章吧. 看完本篇,你将会了解到: 1.ArrayDeque是什么? 2. ...

  3. 泛化之美--C++11可变模版参数的妙用

    1概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.相比C++98/03 ...

  4. 外网访问局域网ip的方法

    https://jingyan.baidu.com/article/48b558e335e3ac7f39c09a59.html 步骤: 1.浏览器内输入:192.168.1.1进入路由器管理界面 2. ...

  5. JDBC-Statement,prepareStatement,CallableStatement的比较

    参考:https://www.cnblogs.com/Lxiaojiang/p/6708570.html JDBC核心API提供了三种向数据库发送SQL语句的类: Statement:使用create ...

  6. [20180627]测试bbed是否支持管道命令.txt

    [20180627]测试bbed是否支持管道命令.txt --//测试bbed是否支持管道命令.txt 1.环境:SCOTT@test01p> @ ver1PORT_STRING         ...

  7. localStorage,sessionStorage的使用

    最近因为项目上需要使用到客户端存储,所以稍微研究了一下,以下说说自己的理解和使用经验 1.调用方法相同 各自都包含以下几种操作: //根据key获取对应的值; window.sessionStorag ...

  8. python第二十二天-----在做作业当中............

    作业 1, ATM:模拟实现一个ATM + 购物商城程序 额度 自定义实现购物商城,买东西加入 购物车,调用信用卡接口结账可以提现,手续费5%支持多账户登录支持账户间转账记录每月日常消费流水提供还款接 ...

  9. C#基础(string)

    https://msdn.microsoft.com/zh-cn/library/84787k22(v=vs.110).aspx 1.Compare基本方法 public static int Com ...

  10. Django框架的使用教程--站点的管理[七]

    Django的站点管理 创建超级管理员命令(密码要8位) python manage.py createsuperuser 进入站点管理 注册模型类 from django.contrib impor ...