题目链接

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. 使用WebStorm/IDEA上传本地项目到GitHub

    在使用 WebStorm/IDEA 上传本地项目到 GitHub 之前,先要做一些相关配置. 以 WebStorm 为例,IDEA 同. 首先打开 WebStorm ,依次点击File -> S ...

  2. jquery冲突的关键字nodeName、nodeValue和nodeType!

    原文:http://blog.csdn.net/hdfyq/article/details/52805836 [缘由]在工作流数据库设计的时候,  都节点管理的功能.  结果有2个字段为  NODE_ ...

  3. CodeForces 600C【构造】

    题意: 在原字符串中修改数量最少,然后保证最小字典序. #include <bits/stdc++.h> using namespace std; typedef long long LL ...

  4. [Xcode 实际操作]九、实用进阶-(31)为IAP(支付方式)内购功能的具体实现和测试

    目录:[Swift]Xcode实际操作 本文将演示如何为IAP(支付方式)内购功能的具体实现和测试. 内购是苹果市场上的一种常见的盈利方式. 在项目中确保已经安装了第三方库[Pod],双击[Podfi ...

  5. Node.js 关于module的一些认知

    module是一个对象,在Node环境中运行js脚本,module会自动添加,并且系统会将函数封装到另一个函数中 例如: var module = { id: '.', exports: {} }; ...

  6. 给 UILabel 中的文字增加 line-through / Strikethrough (删除线)样式

    iOS 6 中苹果引入了 NSStrikethroughStyleAttributeName 属性,用于设置 NSAttributedString 的删除线样式,用法如下: let attribute ...

  7. 多线程 GCD队列组

    //  DYFViewController.m //  623-08-队列组 // //  Created by dyf on 14-6-23. //  Copyright (c) 2014年 ___ ...

  8. ssh断开后保持程序运行

    https://blog.csdn.net/gatieme/article/details/52777721 https://blog.51cto.com/zjking/1117828 https:/ ...

  9. jQuery offset()源码解析

    首先是原型上的offset方法,根据arguments判断到底是取值还是设值.如果是设置,就遍历调用静态方法jQuery.offset.setOffset 如果是取值.那么就是从"var d ...

  10. 调用submit()方式提交表单

    今天在看高级程序设计时看到的这样一段话: 在以调用submit()方法的形式提交表单时,不会触发submit事件 写了一个小例子做了下测试,的确如此: <form id="fm&quo ...