2007: [Noi2010]海拔
2007: [Noi2010]海拔
https://www.lydsy.com/JudgeOnline/problem.php?id=2007
分析:
平面图最小割。
S在左下,T在右上,从S到T的一个路径使得路径右下方全是1,左上方全是0。
一个问题:每个点的高度只能是0/1,所以有些边是一定不能选的,就让它连向S,不影响。
代码:
/*
平面图最小割
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cctype>
#include<queue>
using namespace std;
typedef long long LL; inline int read() {
int x = , f = ; char ch = getchar(); for (; !isdigit(ch); ch=getchar()) if (ch=='-') f = -;
for (; isdigit(ch); ch=getchar()) x = x * + ch - ''; return x * f;
} const int N = ;
struct Edge{
int to, w, nxt;
Edge() {}
Edge(int a,int b,int c) {to = a, w = b, nxt = c;}
}e[];
struct Node{
int u;
LL dis;
Node() {}
Node(int a,LL b) {u = a, dis = b;}
bool operator < (const Node &A) const {
return dis > A.dis;
}
};
int head[N];
LL dis[N];
int Enum, n;
bool vis[N];
priority_queue<Node> q; void add_edge(int u,int v,int w) {
e[++Enum] = Edge(v, w, head[u]); head[u] = Enum;
// cout << u << " " << v << " " << w << '\n';
} int get(int i,int j) {
return (i - ) * n + j;
} int Dijkstra(int S,int T) {
for (int i=; i<=T; ++i) dis[i] = 1e18, vis[i] = false;
dis[S] = ;
q.push(Node(S,));
Node now, nxt;
while (!q.empty()) {
now = q.top(); q.pop();
int u = now.u;
if (vis[u]) continue;
vis[u] = true;
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (dis[v] > dis[u] + e[i].w) {
dis[v] = dis[u] + e[i].w;
q.push(Node(v,dis[v]));
}
}
}
return dis[T];
} int main() {
n = read();
int S = , T = n * n + ; for (int i=; i<=n+; ++i) { // 左 -> 右, 下 -> 上
for (int j=; j<=n; ++j) {
int w = read();
if (i == ) add_edge(get(i, j), T, w);
else if (i == n + ) add_edge(S, get(i - , j), w);
else add_edge(get(i, j), get(i - , j), w);
}
} for (int i=; i<=n; ++i) { // 上 -> 下 , 左 -> 右
for (int j=; j<=n+; ++j) {
int w = read();
if (j == ) add_edge(S, get(i, j), w);
else if (j == n + ) add_edge(get(i, j - ), T, w);
else add_edge(get(i, j - ), get(i, j), w);
}
} for (int i=; i<=n+; ++i) { // 右 -> 左 , 上 -> 下
for (int j=; j<=n; ++j) {
int w = read();
if (i == ) add_edge(T, get(i, j), w);
else if (i == n + ) add_edge(get(i - , j), S, w);
else add_edge(get(i - , j), get(i, j), w);
}
} for (int i=; i<=n; ++i) { // 下 -> 上 , 右 - > 左
for (int j=; j<=n+; ++j) {
int w = read();
if (j == ) add_edge(get(i, j), S, w);
else if (j == n + ) add_edge(T, get(i, j - ), w);
else add_edge(get(i, j), get(i, j - ), w);
}
}
printf("%d",Dijkstra(S, T));
return ;
}
2007: [Noi2010]海拔的更多相关文章
- BZOJ 2007: [Noi2010]海拔
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2410 Solved: 1142[Submit][Status] ...
- 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2504 Solved: 1195 Description YT市 ...
- 2007: [Noi2010]海拔 - BZOJ
Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)× ...
- [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】
题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...
- BZOJ.2007.[NOI2010]海拔(最小割 对偶图最短路)
题目链接 想一下能猜出,最优解中海拔只有0和1,且海拔相同的点都在且只在1个连通块中. 这就是个平面图最小割.也可以转必须转对偶图最短路,不然只能T到90分了..边的方向看着定就行. 不能忽略回去的边 ...
- bzoj 2007 [Noi2010]海拔——最小割转最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2007 一个点的高度一定不是0就是1.答案一定形如一个左上角的连通块全是0的点.一个右下角的连 ...
- 【BZOJ】2007: [Noi2010]海拔(平面图转对偶图)
题目 传送门:QWQ 分析 左上角是0,右下角是1.那么大概整张图是由0 1构成的. 那么我们要找到0和1的分界线,值就是最小割. 然后变成求原图最小割. 考虑到此题是平面图,那么就转成对偶图跑最短路 ...
- bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
上来就跑3e5的最大流--脑子抽了 很容易看出,每个地方的海拔都是0或1因为再高了没有意义,又,上去下来再上去没有意义,所以最后一定是从s连着一片0,剩下连着t一片1,然后有贡献的就是01交接的那些边 ...
- NOI2010海拔
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 1302 Solved: 612[Submit][Status] ...
随机推荐
- python 带BOM头utf-8的响应解码
接口响应编码格式为带BOM头utf-8.直接获取响应的text出现乱码. '''dinghanhua2018-11requests text与content,指定响应的encoding''' api ...
- C语言 条件编译(if )
#include <stdio.h> #define NUM -1 int main(int argc, const char * argv[]) { #if NUM > 0 pri ...
- IOS CoreLocation框架的使用(用于地理定位)
● 在移动互联网时代,移动app能解决用户的很多生活琐事,比如 ● 导航:去任意陌生的地方 ● 周边:找餐馆.找酒店.找银行.找电影院 ● 在上述应用中,都用到了地图和定位功能,在iOS开发中 ...
- IOS 极光推送(第三方框架)
下载极光推送文件,将以下两个文件导入项目中 APService.h libpushSDK.a #import "HMAppDelegate.h" #import "APS ...
- python:序列与模块
一,序列化模块 什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就 ...
- 【洛谷P1037】 产生数
产生数 题目链接 本着“水题不可大做”的原则,我直接字符串hash+爆搜,成功爆栈.. 我们发现,依次搜索每一位能取到的数字个数,最后乘起来即可(乘法原理) 然后又爆了一个点.. long long存 ...
- Sublime Text Build 3065 License key
Sublime Text Build 3065 License key 复制如下三个任意一个正版注册码即可 —– BEGIN LICENSE —– Andrew Weber Single User ...
- static函数
C语言中使用静态函数的好处: 静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多. 关键字“static”,译成中文就是“静态 ...
- Django-rest-framework(二)serializers 使用
简介 初次见到serializers文件,想必大家都会感到陌生,所以,我们不妨换个词来形容他的作用,那就是django 中的Form,这样是不是感觉熟悉了一点. 实际上,serializers 的作用 ...
- http返回值含义
1xx:信息响应类,表示接收到请求并且继续处理2xx:处理成功响应类,表示动作被成功接收.理解和接受 3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理4xx:客户端错误,客户请求包含语法错 ...