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. python数据类型内置方法

    内容概要 列表内置方法 字典内置方法 字符串转换成字典的方法 eval() 元组内置方法 元组相关笔试题 集合内置方法 列表内置方法 l1 = [2, 4, 5, 7, 3, 9, 0, 6] # 升 ...

  2. WebKit Inside: DOM树的构建

    当客户端App主进程创建WKWebView对象时,会创建另外两个子进程:渲染进程与网络进程.主进程WKWebView发起请求时,先将请求转发给渲染进程,渲染进程再转发给网络进程,网络进程请求服务器.如 ...

  3. Django的后台管理系统Admin(5)

    Django的后台管理系统就是为了方便管理员管理网站,所以django自带了一个后台管理系统,接下来记录一下如何使用这个后台的管理系统. 首先我们要进入后台管理系统,就要有一个管理员的账号,先来创建有 ...

  4. pytest--mark基本使用(主要通过pytest.ini文件注册标签名,对用例进行标记分组)

    1.pytest中的mark介绍 mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记 名),实现测试分组功能,并能和其它插件配合设置测试方法执行顺序等.如下 图,现在需要只执行红色 ...

  5. Kali Linux解压包命令:

    Kali Linux解压包命令: tar.gz格式压缩包: root@kali:~# tar -xzvf 压缩包.tar.gz -C /root/home/Desktop root@kali:~# c ...

  6. 把SQLAlchemy查询对象转换成字典

    1-假设查出来的为单个对象 1-1 在model.py中为模型对象添加字典转换函数: from exts import db class User(db.Model): __tablename__ = ...

  7. 【C# 线程】 volatile 关键字和Volatile类、Thread.VolatileRead|Thread.VolatileWrite 详细 完整

    overview 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁).SpinLocked(自旋锁).易变构造(volatile关键字.volatile类.Thr ...

  8. C#10 新功能

    C# 10.0 向 C# 语言添加了以下功能和增强功能: 记录结构 结构类型的改进 可使用 const 内插字符串 内插字符串处理程序 global using 指令 文件范围的命名空间声明 扩展属性 ...

  9. c++ stringstream 实现字符串与int之间的转换

    #include <iostream> #include <sstream> using namespace std; int main() { //string转int st ...

  10. 操作Jexus

    jws.start等命令在Jexus V5.6.3中已经合并为一个单一命令,即"jws",这是一个shell脚本文件. 命令参数与对应的功效: jws start : 启动Jexu ...