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]海拔的更多相关文章

  1. BZOJ 2007: [Noi2010]海拔

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

  2. 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2504  Solved: 1195 Description YT市 ...

  3. 2007: [Noi2010]海拔 - BZOJ

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

  4. [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】

    题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...

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

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

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

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

  7. 【BZOJ】2007: [Noi2010]海拔(平面图转对偶图)

    题目 传送门:QWQ 分析 左上角是0,右下角是1.那么大概整张图是由0 1构成的. 那么我们要找到0和1的分界线,值就是最小割. 然后变成求原图最小割. 考虑到此题是平面图,那么就转成对偶图跑最短路 ...

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

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

  9. NOI2010海拔

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

随机推荐

  1. 高效实时的网络会议数据传输库—UDT

    在视频会议系统的研发当中,我们的音.视频数据必须要有相应的可靠性作为保障,因为视频会议系统是一个实时性非常强的系统,如果其数据在网络不太好的情况下,有可能会出现丢包.数据延迟.数据堵塞等现象,出现这些 ...

  2. Django:Django的路由系统

    一,URLconf配置 1,基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 2 ...

  3. STL - rope 【强大的字符串处理容器】

    包含头文件: #include<ext/rope> using namespace __gnu_cxx; 申请: rope text; 基本操作: test.push_back(x); / ...

  4. c# 常见验证邮箱、电话号码、日期等格式

    #region 验证邮箱验证邮箱 /**//// <summary> /// 验证邮箱 /// </summary> /// <param name="sour ...

  5. code First 三 Fluent API

    Entity Framework Fluent API用于配置域类以覆盖约定. 在实体框架6中,DbModelBuilder类充当Fluent API,我们可以使用它来配置许多不同的东西.它提供了比数 ...

  6. Python语法糖

    1.装饰器 ####装饰器的固定格式 ##普通版本 def timer(func): def inner(*args,**kwargs): '''执行函数之前要做的''' ret = func(*ar ...

  7. css选择器有哪些

    css的选择器是还是比较富的,主要的css选择器如下: 标签选择器(如:body,div,p,ul,li) .类选择器(如:class="head",class="hea ...

  8. dcm4che 的依赖无法下载

    遇到问题时我在Gradle这样引入 maven { url "http://www.dcm4che.org/maven2"} 这样使用可以解决问题 maven { url &quo ...

  9. c/c++面试总结---c语言基础算法总结2

    c/c++面试总结---c语言基础算法总结2 算法是程序设计的灵魂,好的程序一定是根据合适的算法编程完成的.所有面试过程中重点在考察应聘者基础算法的掌握程度. 上一篇讲解了5中基础的算法,需要在面试之 ...

  10. 『ACM C++』Virtual Judge | 两道基础题 - The Architect Omar && Malek and Summer Semester

    这几天一直在宿舍跑PY模型,学校的ACM寒假集训我也没去成,来学校的时候已经18号了,突然加进去也就上一天然后排位赛了,没学什么就去打怕是要被虐成渣,今天开学前一天,看到最后有一场大的排位赛,就上去试 ...