题目链接
题意:
给你一个网格图,正反边边权不同,从海拔低的地方到海拔高的地方的代价是海拔差乘边权,海拔高到海拔低的地方不需要代价。左上角海拔是0,右下角海拔是1,让你任意安排其他点的海拔,使得每条边都被经过一次的代价之和最小。
话说我题意描述的好像有点糟糕啊,看不懂就还是看原题吧。

题解:
分析一下不难想出如果给一个点赋值为除了0和1之外的数一定是不优的,推一下可以得到一个不等关系。然后我们要是手画几个图我们会发现,我们01交界处应该是连续的一条线,这个yy一下或者造几个例子应该就会发现,然后我们相当于要分割开,就会想到要最小割。
由于题目是网格图,属于平面图,所以可以平面图转对偶图之后求最短路来解决这种最小割问题。
这两天刚学了平面图转对偶图这种东西。我来简单地根据我的理解介绍一下,具体可以看这个讲解。我感觉就是把原图中每一个封闭的图形看作一个点,两个图形相邻就在两个新点之间连边,对于原图四周的边,我们建立源点和汇点与它们连边,为了满足是个割,源点和汇点不再是原图源点和汇点的位置,而是源点在左下(右上),汇点在右上(左下),然后源点看作与左侧和下侧相邻,负责连左侧和下侧的边,汇点负责右侧和上侧,这样建出来的图才会发现走过某条路径相当于割掉某条路径,也是因为这个原因,我们把最小割转化为了最短路问题。

记着要用堆优迪杰,SPFA真的可以被卡,不仅刚过去的NOI2018卡了SPFA,据说这题也是卡SPFA了,奉劝看到这篇文章的各位在大赛中就不要用SPFA这种复杂度不太对的东西了。
最后就是平面图最小割转对偶图最短路的题的时候一定脑子清楚一点,连边的时候想清楚编号,连边时记得是给对偶图连边,别连着连着连成平面图了。
记得开long long

代码:

#include <bits/stdc++.h>
using namespace std;int n,st,ed,hed[5000010],cnt,vis[1000010];
struct node
{int to,next;long long dis;
}a[12000010];
long long dis[5000010];
priority_queue <pair<long long,int> > q;
inline void add(int from,int to,long long dis)
{ a[++cnt].to=to;a[cnt].dis=dis;a[cnt].next=hed[from];hed[from]=cnt;
}
int main()
{scanf("%d",&n);st=10*(n+1)*(n+1)+1;ed=st+1;for(int i=1;i<=n+1;++i){for(int j=1;j<=n;++j){long long x;scanf("%lld",&x);if(i==1){add(j+(i-1)*n,ed,x);}if(i==n+1){add(st,j+(i-2)*n,x);}if(i!=n+1&&i!=1){add(j+(i-1)*n,j+(i-2)*n,x);}}}for(int i=1;i<=n;++i){for(int j=1;j<=n+1;++j){long long x;scanf("%lld",&x);if(j==1){add(st,(i-1)*n+j,x);}if(j==n+1){           add((i-1)*n+j-1,ed,x);}if(j!=1&&j!=n+1){add((i-1)*n+j-1,(i-1)*n+j,x);}}}for(int i=1;i<=n+1;++i){for(int j=1;j<=n;++j){long long x;scanf("%lld",&x);if(i==1){add(ed,j+(i-1)*n,x);}if(i==n+1){add(j+(i-2)*n,st,x);}if(i!=n+1&&i!=1){add(j+(i-2)*n,j+(i-1)*n,x);}}}for(int i=1;i<=n;++i){for(int j=1;j<=n+1;++j){long long x;scanf("%lld",&x);if(j==1){add((i-1)*n+j,st,x);}if(j==n+1){add(ed,(i-1)*n+j-1,x);}if(j!=1&&j!=n+1){add((i-1)*n+j,(i-1)*n+j-1,x);}}}memset(dis,0x3f,sizeof(dis));dis[st]=0;q.push(make_pair(0,st));while(!q.empty()){int x=q.top().second;q.pop();if(vis[x])continue;vis[x]=1;for(int i=hed[x];i;i=a[i].next){int y=a[i].to;if(dis[y]>dis[x]+a[i].dis){dis[y]=dis[x]+a[i].dis;q.push(make_pair(-dis[y],y));}}}printf("%lld\n",dis[ed]);return 0;
}

洛谷2046 BZOJ2007 NOI2010 海拔 平面图最小割相关推荐

  1. 洛谷 - P2774 方格取数问题(最小割-最大流+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*m的棋盘,每个位置都有一个正整数,现在要从方格中取数,要求任意两个数在方格中的位置不相邻,求取出的数的最大和 题目分析:正难则反,在这个题目中正着建图比较难, ...

  2. 洛谷 - P1361 - 小M的作物 - 最小割 - 最大权闭合子图

    第一次做最小割,不是很理解. https://www.luogu.org/problemnew/show/P1361 要把东西分进两类里,好像可以应用最小割的模板,其中一类A作为源点,另一类B作为汇点 ...

  3. 洛谷 P1646 [国家集训队]happiness 网络流 最小割 Dinic+当前弧优化

    题目链接: https://www.luogu.com.cn/problem/P1646 参考博客: https://siyuan.blog.luogu.org/solution-p1646 算法:网 ...

  4. 洛谷 P3388 【模板】割点(割顶) 根+非根+dfn[]+low[]+不一样的Tarjan算法

    洛谷  P3388 [模板]割点(割顶)  根+非根+dfn[]+low[]+不一样的Tarjan算法 Tarjan算法,详见https://blog.csdn.net/mrcrack/article ...

  5. 洛谷 P2046 BZOJ 2007 海拔(NOI2010)

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

  6. BZOJ2007 NOI2010 海拔 网络流+最短路

    题意:给定一个N*N的网格,每个格点均与周围的八个点连边,每条边有一个边权,求安排每个点的点权h,使$\sum\limits_{e \in G} {e.w \times \min \{ ({h_{e. ...

  7. 洛谷 - P1361 小M的作物(最大流最小割)

    题目链接:点击查看 题目大意:给出 n 个植物,每个植物种在 A 农场的收益是 a[ i ] ,种在 B 农场的收益是 b[ i ] ,再给出 m 组关系,每组中的所有植物如果都在 A 农场的话额外收 ...

  8. 洛谷 - P4043 [AHOI2014/JSOI2014]支线剧情(最小费用可行流)

    题目链接:点击查看 题目大意:给出一张 n 个点的有向图,每条边都有边权,现在要求将每条边至少遍历一遍,问最小的边权为多少 题目分析:建图时将每条边都设置流量为 [ 1 , inf ] ,就变成最小费 ...

  9. bzoj2007: [Noi2010]海拔

    今天各位D初一小猴子的情景 你学网络流? 来来来师兄给你来几题? 无源汇有上下界费用流会不会? 最大权闭合子图会不会? 黑白染色会不会? 这都不会? 菜鸡yzh:你能不能不用网络流做狼抓兔子 ... ...

最新文章

  1. 前福娃集团营销总监-周胜哥箴言
  2. Tomcat 架构原理解析到架构设计借鉴
  3. 0421实验二 作业调度模拟程序
  4. Android常见面试题解答
  5. 【Linux网络编程】TCP三次握手和四次挥手
  6. 软考信息系统项目管理师_管理科学(运筹学)2---软考高级之信息系统项目管理师034
  7. 图像处理:Canny边缘检测算法原理(一)
  8. 大鱼吃豆子游戏java_java swing开发简单的大鱼吃豆子小游戏,可用于毕业设计(附详细设计文档)...
  9. python Socket网络编程
  10. HDL.Companion.v2.8.R1.for.Windows linux64 编程开发软件
  11. 农村三资管理平台app_农村三资管理系统功能
  12. (2)香橙派+apache2与php+天猫精灵=自建平台语音支持--香橙派操作系统安装
  13. 最新USDT支付系统+支持ERC20/OMNI/代理商/第三方API
  14. Cypress初探(一)
  15. html5 下一页的代码,jsp实现上一页下一页翻页功能(示例代码)
  16. JAVA -- 正则表达式高级学习技巧
  17. pythonmatplotlib绘图小提琴_python 箱线图和小提琴图
  18. 雨听 | 英语学习笔记(十)~作文范文:怎样提高学生体能?
  19. 毕业论文排版及格式修改“骚操作”和常见误区(Word基础)
  20. tracert命令介绍

热门文章

  1. 给风的信----平凡的世界
  2. ASP.NET 使用MQTT实现通信 简介
  3. 垂直搜索引擎发展的几个方向 1
  4. 递归法实现折半查找(二分查找)
  5. DataFrame之iloc与loc的一些容易被忽略的区别
  6. (附源码)springboot在线投票系统 毕业设计 141307
  7. Excel2016打开文件后显示空白
  8. css3的相邻选择器,CSS选择器之相邻兄弟选择器
  9. miaov css基础学习笔记
  10. 人到中年,无论你混的好不好,都必须明白的五条人性铁律