题目链接

SOLUTION

想一下最优情况下肯定让平路或下坡尽量多,于是不难想到这样构图:包括左上角的一部分全部为\(0\),包括右下角的一部分全部为\(1\),于是现在问题转化为求那个分界线是什么。

画一画图,发现每条分界线对应一组割,转化成了最小割模型,然后因为数据范围对\(dinic\)不友好,化成对偶图跑最短路就行了

注意不能只考虑向下和向右的边

代码:

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <random>
#include <string>
#include <vector>
#include <cmath>
#include <ctime>
#include <queue>
#include <map>
#include <set> #define IINF 0x3f3f3f3f3f3f3f3fLL
#define u64 unsigned long long
#define pii pair<int, int>
#define mii map<int, int>
#define u32 unsigned int
#define lbd lower_bound
#define ubd upper_bound
#define INF 0x3f3f3f3f
#define vi vector<int>
#define ll long long
#define mp make_pair
#define pb push_back
#define is insert
#define se second
#define fi first
#define ps push #define $SHOW(x) cout << #x" = " << x << endl
#define $DEBUG() printf("%d %s\n", __LINE__, __FUNCTION__) namespace FastIO {
const int SIZE = (1 << 21) + 1;
char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c, qu[55];
int qr;
#define gc() (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, SIZE, stdin), (iS == iT ? EOF : *iS++)) : *iS++) // getchar
inline void flush() { fwrite(obuf, 1, oS - obuf, stdout); oS = obuf; } // print the remaining part
inline void putc(char x) { *oS++ = x; if (oS == oT) flush(); } // putchar
inline void wrap() { *oS++ = '\n'; if (oS == oT) flush(); } // wrap
template <class I>
inline void gi(I &x) { // input an integer
I sign = 1;
for (c = gc(); c < '0' || c > '9'; c = gc()) if (c == '-') sign = -1;
for (x = 0; c <= '9' && c >= '0'; c = gc()) x = x * 10 + (c & 15);
x *= sign;
}
inline int gi() { // input an int
int x, sign = 1;
for (c = gc(); c < '0' || c > '9'; c = gc()) if (c == '-') sign = -1;
for (x = 0; c <= '9' && c >= '0'; c = gc()) x = x * 10 + (c & 15);
return x * sign;
}
inline ll gl() { // input an long long
ll x, sign = 1;
for (c = gc(); c < '0' || c > '9'; c = gc()) if (c == '-') sign = -1;
for (x = 0; c <= '9' && c >= '0'; c = gc()) x = x * 10 + (c & 15);
return x * sign;
}
template <class I>
inline void print(I &x) { // print a integer
if (!x) putc('0');
while (x) qu[++qr] = x % 10 + '0', x /= 10;
while (qr) putc(qu[qr--]);
}
template <class I>
inline void println(I &x) { // print a integer and wrap
if (!x) putc('0');
while (x) qu[++qr] = x % 10 + '0', x /= 10;
while (qr) putc(qu[qr--]);
wrap();
}
} using namespace std;
// using namespace FastIO; #define MAXN 250000 struct Edge {
int next, to, w;
}e[20 * MAXN + 5]; int n, S = MAXN + 1, T = MAXN + 2;
int head[MAXN + 5], eid, d[MAXN + 5];
bool inq[MAXN + 5]; void addEdge(int x, int y, int w) {
e[++eid].next = head[x];
e[eid].to = y;
e[eid].w = w;
head[x] = eid;
} void spfa() {
queue<int> q;
memset(d, 0x3f, sizeof d);
d[S] = 0;
q.push(S);
inq[S] = 1;
while(!q.empty()) {
int u = q.front(); q.pop();
inq[u] = 0;
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].to, w = e[i].w;
if (d[v] > d[u] + w) {
d[v] = d[u] + w;
if (!inq[v]) q.push(v), inq[v] = 1;
}
}
}
} int main() {
scanf("%d", &n);
for (int i = 1, x; i <= n; ++i)
scanf("%d", &x), addEdge(i, T, x);
for (int i = 1; i < n; ++i)
for (int j = 1, x; j <= n; ++j)
scanf("%d", &x), addEdge(i * n + j, (i - 1) * n + j, x);
for (int i = 1, x; i <= n; ++i)
scanf("%d", &x), addEdge(S, (n - 1) * n + i, x);
for (int i = 1, x; i <= n; ++i) {
scanf("%d", &x);
addEdge(S, (i - 1) * n + 1, x);
for (int j = 1; j < n; ++j)
scanf("%d", &x), addEdge((i - 1) * n + j, (i - 1) * n + j + 1, x);
scanf("%d", &x);
addEdge(i * n, T, x);
}
for (int i = 1, x; i <= n; ++i)
scanf("%d", &x), addEdge(T, i, x);
for (int i = 1; i < n; ++i)
for (int j = 1, x; j <= n; ++j)
scanf("%d", &x), addEdge((i - 1) * n + j, i * n + j, x);
for (int i = 1, x; i <= n; ++i)
scanf("%d", &x), addEdge((n - 1) * n + i, S, x);
for (int i = 1, x; i <= n; ++i) {
scanf("%d", &x);
addEdge((i - 1) * n + 1, S, x);
for (int j = 1; j < n; ++j)
scanf("%d", &x), addEdge((i - 1) * n + j + 1, (i - 1) * n + j, x);
scanf("%d", &x);
addEdge(T, i * n, x);
}
spfa();
printf("%d\n", d[T]);
return 0;
}

[NOI2010]海拔——最小割+对偶图的更多相关文章

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

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

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

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

  3. [NOI2010]海拔(最小割)

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

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

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

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

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

  6. BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割

    题面太长啦,请诸位自行品尝—>海拔 分析: 这是我见过算法比较明显的最小割题目了,很明显对于某一条简单路径,海拔只会有一次变换. 而且我们要最终使变换海拔的边权值和最小. 我们发现变换海拔相当于 ...

  7. [NOI2010]海拔 平面图转对偶图 最小割

    题解: 首先,我们不难猜到高度只有 $0$ 或 $1$ 两种可能,而且高度为 0 的地区组成一个联通块,高度为 1 的地区组成一个联通块.只有这样,人们所耗费的体力才是最小的.得出这个结论,题目就成了 ...

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

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

  9. BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]

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

随机推荐

  1. Swift3.0 Alamofire网络请求的封装(get,post,upload图片上传)转

    转自: http://blog.csdn.net/C_calary/article/details/53193747 学习Swift 试着动手写个天气小app,搜集资料这个封装还蛮好用的. 我用的第三 ...

  2. 51nod1352(exgcd)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1352 题意:中文题诶- 思路:exgcd 显然题目可以描述为: ...

  3. django框架知识3

    1.Django安装: 1.安装版本Django1.11.11 2.安装方式:命令行安装   pycharm安装 2.创建Django项目 1.创建方式:cd到你要创建的目录下  然后输入 Djang ...

  4. hyperledger fabric 1.0.5 分布式部署 (一)

    环境是个人虚拟机ubuntu 16.04 64 位版本 前期用户需要先安装好:gcc.g++.git 软件 安装 golang 首先给环境安装一个 go 语言环境,版本最好在1.8 以上 golang ...

  5. 快速删除node_modules文件夹

    前言 当安装了较多模块后,node_modules目录下的文件会很多,直接删除整个目录会很慢,下面介绍些快速删除node_modules目录的方法. 方法一:使用rimraf模块的命令 在全局安装ri ...

  6. Java中try catch finally语句中含有return语句的执行情况

    finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因.下面 ...

  7. Ubuntu-apt安装Jenkins

    系统环境: Ubuntu 16.0.4 2CPU,8G 1.默认Ubuntu软件包里没有Jenkins 2.系统里添加存储密钥 wget -q -O - https://pkg.jenkins.io/ ...

  8. POJ 1458 Common Subsequence DP

    http://poj.org/problem?id=1458 用dp[i][j]表示处理到第1个字符的第i个,第二个字符的第j个时的最长LCS. 1.如果str[i] == sub[j],那么LCS长 ...

  9. 重新安装Magento2 Module

    如何重新安装Magento2的Module? 分类 2 类: Module是通过 composer 安装的:在命令行输入:php bin/magento module:uninstall Module ...

  10. 在Window上用cmd创建.htaccess文件

    Windows 图形下不能直接建立空名字的文件,所以没法直接创建.htaccess文件,不过可以通过命令行创建: cd /path/to/your/dir/ type nul>.htaccess ...