题面

完了,做的时候已经想不起来分层图这个东西了QAQ

对于这种“多种”路径加中转站的题,还有那种有若干次“特殊能力”的题,都可以考虑用分层图来做

显然只需要记录所有的中转站+起点终点,然后拆出横竖两层,一层的点之间连值为$2$的边,每个站的两层之间连值为$1$的边,然后再跑最短路。注意数组大小,还有起点和终点的两层是连零边的

 #include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,inf=0x3f3f3f3f;
struct a
{
int xx,yy,id;
}mem[N];
struct b{int node,dist;};
bool operator < (b x,b y)
{
return x.dist>y.dist;
}
priority_queue<b> hp;
int val[*N],dis[*N],vis[*N];
int p[*N],noww[*N],goal[*N];
int n,m,t1,t2,st,ed,cnt,tot;
bool cmp1(a x,a y)
{
return x.xx==y.xx?x.yy<y.yy:x.xx<y.xx;
}
bool cmp2(a x,a y)
{
return x.yy==y.yy?x.xx<y.xx:x.yy<y.yy;
}
void link(int f,int t,int v)
{
noww[++cnt]=p[f],p[f]=cnt;
goal[cnt]=t,val[cnt]=v;
}
void Dijkstra(int s)
{
memset(dis,0x3f,sizeof dis);
dis[s]=,hp.push((b){s,});
while(!hp.empty())
{
b tt=hp.top(); hp.pop(); int tn=tt.node;
if(vis[tn]) continue ; vis[tn]=true;
for(int i=p[tn];i;i=noww[i])
if(dis[goal[i]]>dis[tn]+val[i])
dis[goal[i]]=dis[tn]+val[i],hp.push((b){goal[i],dis[goal[i]]});
}
}
int main ()
{
scanf("%d%d",&n,&m),st=++m,ed=++m;
link(st,st+m,),link(st+m,st,);
link(ed,ed+m,),link(ed+m,ed,);
for(int i=;i<=ed;i++)
{
scanf("%d%d",&mem[i].xx,&mem[i].yy);
mem[i].id=++tot,link(tot,tot+m,),link(tot+m,tot,);
}
sort(mem+,mem++tot,cmp1);
for(int i=;i<=st;i++)
if(mem[i].xx==mem[i+].xx)
{
link(mem[i].id,mem[i+].id,*(mem[i+].yy-mem[i].yy));
link(mem[i+].id,mem[i].id,*(mem[i+].yy-mem[i].yy));
}
sort(mem+,mem++tot,cmp2);
for(int i=;i<=st;i++)
if(mem[i].yy==mem[i+].yy)
{
link(mem[i].id+m,mem[i+].id+m,*(mem[i+].xx-mem[i].xx));
link(mem[i+].id+m,mem[i].id+m,*(mem[i+].xx-mem[i].xx));
}
Dijkstra(st),dis[ed]>=inf?printf("-1"):printf("%d",dis[ed]);
return ;
}

解题:SHOI 2012 回家的路的更多相关文章

  1. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  2. 分层图最短路【bzoj2834】: 回家的路

    分层图最短路[bzoj2834]: 回家的路 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2834 这道题难在建边. 自己写的时候想到了 ...

  3. bzoj 2834: 回家的路

    题目 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  DCOI Logout 捐赠本站 Notice:1 ...

  4. P3831 [SHOI2012]回家的路

    P3831 [SHOI2012]回家的路 分层图基础题,就是建图稍有麻烦   #include<cstdio> #include<algorithm> #include< ...

  5. [转]9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路

    1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...

  6. 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路

    1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...

  7. (转)9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路

    原文:http://www.cnblogs.com/figure9/archive/2013/01/09/2853649.html 1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也 ...

  8. [SHOI2012]回家的路

    题目背景 SHOI2012 D2T1 题目描述 2046 年 OI 城的城市轨道交通建设终于全部竣工,由于前期规划周密,建成后的轨道交通网络由2n2n条地铁线路构成,组成了一个nn纵nn横的交通网.如 ...

  9. [SHOI2012]回家的路 最短路

    ---题面--- 题解: 吐槽:找了好久的错,换了n种方法,重构一次代码,,,, 最后发现,,, 数组开小了,其实一开始尝试开大了数组,但唯独没有尝试开大手写队列的数组.... 思路: 有两种方法,这 ...

随机推荐

  1. Windows下LimeSDR Mini使用说明

    本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 LimeSDR链接:https://item.taobao.com/item.htm?spm=a230r.1 ...

  2. 初学node.js-nodejs中实现HTTP服务(3)

    一.node.js实现服务端 创建hello-world-server.js文件,服务端源码如下: /** * node.js实现http服务端 */ var http = require('http ...

  3. python-五行红旗实现

    import turtle """ 绘制五星红旗 作者:zxj 版本:1.0 """ # 绘制矩形函数 def giant(leg,hig) ...

  4. 【异常检测】Isolation forest 的spark 分布式实现

    1.算法简介 算法的原始论文 http://cs.nju.edu.cn/zhouzh/zhouzh.files/publication/icdm08b.pdf .python的sklearn中已经实现 ...

  5. dmesg命令详解

    基础命令学习目录 http://linux.cn/article-3587-1.html dmesg 命令的使用范例 下面我们展示一些最负盛名的‘dmesg’命令工具以及其实际使用举例.‘dmesg’ ...

  6. Centos7.4简单安装使用gitlab+maven+jenkins实现java代码的持续集成部署

    1.工具的简单介绍 gitlab--源代码版本管理控制工具 maven--java代码编译构建工具 jenkins--基于java开发的自动化持续集成部署工具 sonar--代码质量管理工具 2.gi ...

  7. python learning Network Programming.py

    Socket # 用一个 Socke t表示"打开了一个网络连接" # 打开一个 Socket 需要知道目标计算机的IP地址和端口号,再指定协议类型即可. # TCP # 主动发起 ...

  8. Visual Studio 中配置openCV问题

    1. 首先强调一点:VS与openCV的版本对应问题,一般而言,openCV对于VS采用向下的支持方式: vc6 -> VS6.0 vc7.0 -> VS2002 vc7.1 -> ...

  9. OSG学习:裁剪变换(2)

    接着上一篇博客说. 还有一种裁剪的方法:osg::Scissor类. 这个类封装了OpenGL中的glScissor()函数. 该类主要用于设置一个视口裁剪平面举行.设置裁剪平面举行的函数如下: vo ...

  10. Mscomm控件安装问题 License information for TMSComm not found.

    操作步骤: 1.打开delphi,菜单选择compoents->import Activex control,然后选择那个mscomm32.ocx安装即可. 2.注册MScomm控件   开始- ...