题目传送门(内部题123)


输入格式

  输入文件的第一行为四个正整数$n,m,k,d$。
  接下来$m$行,每行三个整数$u,v,w$,描述一条无向道路。
  输入文件最后一行包含$k$个整数,为$p_0,p_1,...,p_{k-1}$。


输出格式

  一行一个整数,表示最坏情况下走出迷宫的最短路径的长度。如果最坏情况下走不出迷宫,输出$-1$。


样例

样例输入:

3 4 1 1
0 1 1
0 1 2
1 2 1
1 2 2
2

样例输出:

4


数据范围与提示

  对于$50\%$的数据,满足$m=n-1$。
  对于$90\%$的数据,满足$n\leqslant 1,000,m\leqslant 100,000$。
  对于$100\%$的数据,满足$3\leqslant n\leqslant 100,000,2\leqslant m\leqslant 1,000,000$,道路长度均为不超过$10^9$的正整数。


题解

对于$m=n-1$那$50$分,就是逗你开心的,你以为是棵树,然而却又可能有重边。

那就直接想正解吧。

转化一下题意,就是跑一个拿第$d+1$大的$dis[v]$转移$u$的最短路。

对于每一个点开一个堆就好了。

再讲个故事(你们都喜欢听我讲故事为什么?)

  上午困的痛不欲生……

  (痛不欲生可海星?)

  刚考完试的我:“你们谁能$hack$一下我的算法,!@#$%^&*,大根堆,!@#$%^&*”。

  台下一片沉默……

  下午刚来到机房准备改题的我:唉,我大根堆呢?!

  

故事讲完啦~

时间复杂度:$\Theta(m\log n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec{int nxt,to,w;}e[2000001];
int head[100001],cnt;
int n,m,k,d;
int a[100001];
bool vis[100001],is[100001];
long long dis[100001],ans=0x3f3f3f3f3f3f3f3f;
priority_queue<long long>dq[100001];
priority_queue<pair<long long,int>,vector<pair<long long,int>>,greater<pair<long long,int>>>q;
void add(int x,int y,int w)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
head[x]=cnt;
}
void Dij()
{
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=k;i++)dis[a[i]]=0;
while(q.size())
{
int x=q.top().second;q.pop();
if(vis[x])continue;vis[x]=1;
for(int i=head[x];i;i=e[i].nxt)
{
dq[e[i].to].push(dis[x]+e[i].w);
if(dq[e[i].to].size()>d)
{
if(dis[e[i].to]>dq[e[i].to].top())
{
dis[e[i].to]=dq[e[i].to].top();
q.push(make_pair(dis[e[i].to],e[i].to));
}
dq[e[i].to].pop();
}
}
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&d);
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
u++;v++;add(u,v,w);add(v,u,w);
}
for(int i=1;i<=k;i++){scanf("%d",&a[i]);a[i]++;q.push(make_pair(0,a[i]));}
Dij();
if(dis[1]==0x3f3f3f3f3f3f3f3f)puts("-1");
else printf("%lld",dis[1]);
return 0;
}

rp++

[CSP-S模拟测试]:迷宫(最短路)的更多相关文章

  1. csp-s模拟测试92

    csp-s模拟测试92 关于$T1$:最短路这一定建边最短路. 关于$T2$:傻逼$Dp$这一定线段树优化$Dp$. 关于$T3$:最小生成树+树P+换跟一定是这样. 深入(?)思考$T1$:我是傻逼 ...

  2. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  3. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  4. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  5. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  6. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  7. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  8. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  9. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

随机推荐

  1. Java回调实现异步

    在正常的业务中使用同步线程,如果服务器每处理一个请求,就创建一个线程的话,会对服务器的资源造成浪费.因为这些线程可能会浪费时间在等待网络传输,等待数据库连接等其他事情上,真正处理业务逻辑的时间很短很短 ...

  2. 剑指offer-左旋转字符串-知识迁移能力-python

    题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abcX ...

  3. 解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题

    问题截图: 解决方案: 1.打开File --> Setting 窗口 2.搜索 Webpack 3.选择如下路径 问题解决

  4. 误删除/dec/zero,/dev/null

    误删除/dev/zero [root@MYSQL-MONGO145 dev]# mknod /dev/zero c 1 5[root@MYSQL-MONGO145 dev]# chmod 666 /d ...

  5. JS常见面试题总结-真实被问到的!

    1.判断数据类型有几种方法 console.log(typeof 'abc') // string console.log(Object.prototype.toString.call('abc')) ...

  6. 关于ASP.NET中fileupload控件的缺点

    一.首我来理一理“FileUpload”控件的工作大概原理: FileUpload 控件显示一个文本框控件和一个浏览按钮,使用户可以选择客户端上的文件并将它上载到 Web 服务器.用户通过在控件的文本 ...

  7. subversion(SVN)服务配置及使用方法

      1.安装 yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql -y 2.查看版本 svnserve --vers ...

  8. 韦东山嵌入式Linux学习笔记02--如何给开发板烧录程序

    购买韦东山嵌入式开发板jz2440 v3会标配两根usb线和一根网线,OpenJtag需要单独购买, 我暂时还没买到该工具. 下面介绍usb烧录以及通过网线烧录程序. 1.usb烧录程序: 借助DNW ...

  9. 有关List、Set、Map的基础了解

           刚申请了一个博客,怀着一颗激动的心情我竟不知道写点啥,嗯~来点基础的吧!面试的时候一直被问到的集合框架.        集合,也称为容器,可以将一系列元素组合成一个单元,用于存储.提取. ...

  10. C# 各个版本特性总结

    历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECM ...