[NOI2010]海拔——最小割+对偶图
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]海拔——最小割+对偶图的更多相关文章
- BZOJ.2007.[NOI2010]海拔(最小割 对偶图最短路)
题目链接 想一下能猜出,最优解中海拔只有0和1,且海拔相同的点都在且只在1个连通块中. 这就是个平面图最小割.也可以转必须转对偶图最短路,不然只能T到90分了..边的方向看着定就行. 不能忽略回去的边 ...
- 【bzoj2007】[Noi2010]海拔 最小割+对偶图+最短路
题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个交 ...
- [NOI2010]海拔(最小割)
题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个 正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...
- bzoj 2007 [Noi2010]海拔——最小割转最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2007 一个点的高度一定不是0就是1.答案一定形如一个左上角的连通块全是0的点.一个右下角的连 ...
- P2046 [NOI2010]海拔 平面图转对偶图(最小割-》最短路)
$ \color{#0066ff}{ 题目描述 }$ YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形. ...
- BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割
题面太长啦,请诸位自行品尝—>海拔 分析: 这是我见过算法比较明显的最小割题目了,很明显对于某一条简单路径,海拔只会有一次变换. 而且我们要最终使变换海拔的边权值和最小. 我们发现变换海拔相当于 ...
- [NOI2010]海拔 平面图转对偶图 最小割
题解: 首先,我们不难猜到高度只有 $0$ 或 $1$ 两种可能,而且高度为 0 的地区组成一个联通块,高度为 1 的地区组成一个联通块.只有这样,人们所耗费的体力才是最小的.得出这个结论,题目就成了 ...
- 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2095 Solved: 1002[Submit][Status] ...
- BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 19528 Solved: 4818[Submit][ ...
随机推荐
- Node中的console控制台
1. Node中的console类似于浏览器中的控制台console,它的作用在于帮助开发人员做API的辅助测试. 2. Node中的console主要功能:REPL 2.1 read 读取你输入的内 ...
- 2012 Noip提高组 Day2
1265. [NOIP2012] 同余方程 ★☆ 输入文件:mod.in 输出文件:mod.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 求关于 x 的同余方 ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:4.1 上报位置信息
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- vim 快速定位到文件末尾、头部
gg : 跳转到文件头 Shift+g : 跳转到文件末尾 行数+gg : 跳转到指定行,例跳转到123行:123gg
- get 和 post 请求的区别(转)
转自 http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html http://www.nowamagic.net/librarys/ve ...
- Tomcat - ClassFormatException的解决方法
问题与分析 在使用Tomcat7运行web项目时报错如下: 严重: Compilation error org.eclipse.jdt.internal.compiler.classfmt.Class ...
- spring boot 配置https 报这个错误:java.lang.IllegalArgumentException: Private key must be accompanied by certificate chain
找了接近半天的时间,原来是那么小的问题 server.ssl.key-store=test.jksserver.ssl.key-store-password=123456server.ssl.key- ...
- LIS的简单应用:UVA-437
上一次紫芝详细地介绍了动态规划中的经典问题LIS,今天我们抽出一个类似思想的简单题目进行实践练习. The Tower of Babylon(巴比伦塔) Perhaps you have heard ...
- AtCoder Regular Contest 078 C
C - Splitting Pile Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement Snu ...
- 如何实现序列化为json
因为需要观察对象的数据,所以寻找能自动描述对象中字段名和其值的描述类,咨询了不少人,都推荐使用json,但是json使用起来有一点额外的操作. 需要在文件中引用 using System.Web.Sc ...