bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)

题目描述:

bzoj  luogu

题解时间:

首先考虑海拔待定点的$h$都应该是多少

很明显它们都是$0$或$1$,并且所有$0$连成一块,所有$1$连成一块

只有海拔交界线对答案有贡献,变成了最小割

但是数据范围很明显不能直接跑网络流

由于这是一个平面图,所以根据套路想到:

平面图最小割=对偶图最小环=最外一块面积分成$S$和$T$跑最短路

从左上角往右下角画一条线把外面一块分成$S$和$T$之后建图。

但是要注意这张图上同一条边两个方向权值不同。

那么建边也按照相同方向,即对应向右下方向的边的新建边为$S$->$T$方向,向左上的反之。

然后就可以跑最短路了。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long lint;
namespace LarjaIX
{
const int N=511;
int n,id[N][N];
struct sumireko{int to,ne,w;}e[N*N*8];
int he[N*N*2],ecnt;
void addline(int f,int t,int w)
{
e[++ecnt].to=t,e[ecnt].w=w;
e[ecnt].ne=he[f],he[f]=ecnt;
}
struct shion
{
int x;lint d;
shion(){}
shion(int x,lint d):x(x),d(d){}
bool operator < (const shion &a)const{return d>a.d;}
}stmp;
priority_queue<shion>q;
lint dis[N*N*2];
bool vis[N*N*2];
void dijkstra(int sp,int ep)
{
memset(dis,0x3f,sizeof(dis));
q.push(shion(sp,dis[sp]=0));
while(!q.empty())
{
stmp=q.top(),q.pop();
int x=stmp.x;
if(vis[x]) continue;vis[x]=1;
for(int i=he[x],t=e[i].to;i;i=e[i].ne,t=e[i].to)
{
if(dis[t]>dis[x]+e[i].w)
{
dis[t]=dis[x]+e[i].w;
q.push(shion(t,dis[t]));
}
}
}
printf("%lld\n",dis[ep]);
}
int wi;
int maid()
{
#ifdef debug
freopen("sample.in","r",stdin);
freopen("debug.out","w",stdout);
#endif
scanf("%d",&n);
for(int i=1;i<=n;i++)id[i][0]=id[n+1][i]=0,id[0][i]=id[i][n+1]=n*n+1;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) id[i][j]=(i-1)*n+j;
for(int i=0;i<=n;i++)for(int j=1;j<=n;j++)
scanf("%d",&wi),addline(id[i+1][j],id[i][j],wi);
for(int i=1;i<=n;i++)for(int j=0;j<=n;j++)
scanf("%d",&wi),addline(id[i][j],id[i][j+1],wi);
for(int i=0;i<=n;i++)for(int j=1;j<=n;j++)
scanf("%d",&wi),addline(id[i][j],id[i+1][j],wi);
for(int i=1;i<=n;i++)for(int j=0;j<=n;j++)
scanf("%d",&wi),addline(id[i][j+1],id[i][j],wi);
dijkstra(0,n*n+1);
return 0;
}
}
int main(){return LarjaIX::maid();}

bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)的更多相关文章

  1. BZOJ 2007 海拔(平面图最小割转对偶图最短路)

    首先注意到,把一个点的海拔定为>1的数是毫无意义的.实际上,可以转化为把这些点的海拔要么定为0,要么定为1. 其次,如果一个点周围的点的海拔没有和它相同的,那么这个点的海拔也是可以优化的,即把这 ...

  2. BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路

    问题描述 BZOJ2007 LG2046 题解 发现左上角海拔为 \(0\) ,右上角海拔为 \(1\) . 上坡要付出代价,下坡没有收益,所以有坡度的路越少越好. 所以海拔为 \(1\) 的点,和海 ...

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

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

  4. BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路

    问题描述 BZOJ1001 LG4001 题解 平面图最小割=对偶图最短路 假设起点和终点间有和其他边都不相交的一条虚边. 如图,平面图的若干条边将一个平面划分为若干个图形,每个图形就是对偶图中的一个 ...

  5. BZOJ2007 [Noi2010]海拔 【平面图最小割转对偶图最短路】

    题目链接 BZOJ2007 题解 这是裸题啊,,要是考试真的遇到就好了 明显是最小割,而且是有来回两个方向 那么原图所有向右的边转为对偶图向下的边 向左的边转为向上 向下转为向左 向上转为向右 然后跑 ...

  6. bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)

    平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权. 然后从刚才加的s->t分割出来的两面对应的两个点跑最 ...

  7. 【Bzoj】1001狼抓兔子(平面图最小割转对偶图最短路)

    YEAH 题目链接 终于做对这道题啦    建图的艰辛难以言表- - 顺便说一句我队列转STL啦 狼抓兔子的地图符合平面图定义,于是将该图转成对偶图并求出对偶图的最短路即可. 这篇博客给了我极大的帮助 ...

  8. bzoj1001平面图最小割转对偶图最短路

    https://www.lydsy.com/JudgeOnline/problem.php?id=1001 很明显的求对偶图的最短路即可(由于特判写错了一直wa = = ) //#pragma com ...

  9. B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij

    B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向 ...

随机推荐

  1. JAVA8学习——新的时间日期API&Java8总结

    JAVA8-时间日期API java8之前用过的时间日期类. Date Calendar SimpleDateFormat 有很多致命的问题. 1.没有时区概念 2.计算麻烦,实现困难 3.类是可变的 ...

  2. 图解AI数学基础 | 线性代数与矩阵论

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/83 本文地址:http://www.showmeai.tech/article-det ...

  3. Java多线程Thread类了解和使用

    创建线程的两种方式 extends Thread 类 public class WelComeApp { public static void main(String[] args) { Welcom ...

  4. 常用环境变量配置(vim /etc/profile)

    安装,参考:https://www.cnblogs.com/uncleyong/category/1457906.html # jdk export JAVA_HOME=/usr/local/jdk1 ...

  5. oracle11g在windows下安装

    oracle下载 https://www.oracle.com/database/technologies/oracle-database-software-downloads.html 下载11g ...

  6. Clickhouse 分布式表&本地表 &ClickHouse实现时序数据管理和挖掘

    一.CK 分布式表和本地表 (1)CK是一个纯列式存储的数据库,一个列就是硬盘上的一个或多个文件(多个分区有多个文件),关于列式存储这里就不展开了,总之列存对于分析来讲好处更大,因为每个列单独存储,所 ...

  7. 📚 选择排序和插入排序区别-DS笔记

    选择排序法 A[i...n)未排序,A[0...i)已排序 A[i...n]中最小值要放到A[i]的位置 复杂度 \(O(n^2)\) 第一层循环n次 第二层循环:i=0,n次:i=1,n-1次... ...

  8. WPF中RichTextBox中添加文字的两种方法

    RichTextBox控件不同于TextBox控件,后者可以直接通过其Text属性绑定或者在后台动态添加文字. (一)使用数据绑定 <RichTextBox FontSize="12& ...

  9. oracle 11g rac修改监听端口(远程监听和本地监听)

    转至:https://www.cnblogs.com/yj411511/p/12459533.html 目录 1.修改远程监听端口 1.1 查看远程监听状态 1.2 修改SCAN listener端口 ...

  10. c# 自定义控件-提示框(弹框)

    分带取消按钮和不带取消按钮的 调用方法: frmMessageBox frm = new frmMessageBox("提示", "数据连接失败,请重试!", ...