题目传送门(内部题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. PHP使用CURL抓取页面

    cURL的基本原理 curl是利用URL语法在命令行方式下工作的开源文件传输工具,他能够从互联网上获得各种各样的网络资源.简单来说,curl就是抓取页面的升级版. <?php //1.初始化,创 ...

  2. Two strings CodeForces - 762C (字符串,双指针)

    大意: 给定字符串$a$,$b$, $b$可以任选一段连续的区间删除, 要求最后$b$是$a$的子序列, 求最少删除区间长度. 删除一段连续区间, 那么剩余的一定是一段前缀和后缀. 判断是否是子序列可 ...

  3. 预约系统(二) MVC框架搭建

    采用VS2013,自带的MVC4来搭建 MODEL层,表对象的建立: T_Bm.cs using System; using System.Collections.Generic; using Sys ...

  4. 构造器(Constructor)--构造函数

    构造器是类型的成员之一,其他成员比如,成员字段,成员函数.狭义上,构造器指的是实例构造器(instance constructor) class Student { public int ID; pu ...

  5. .Net高并发解决思路

    转自: 本文如有不对之处,欢迎各位拍砖扶正.另源码在文章最下面,大家下载过后先还原一下nuget包,需要改一下redis的配置,rabbitmq的配置以及Ef的连接字符串.另外使用的是CodeFirs ...

  6. ABCD 谁是小偷

    题目: 警察局抓了a,b,c,d 4名偷窃嫌疑犯,其中只有一人是小偷.审问中,a说:“我不是小偷.”b说:“c是小偷.”c说:“小偷肯定是d.”d说:“c在胡说.” 现在已经知道这四人中有三人说的是真 ...

  7. idea安装完成后要做的几件事(设置字体、编码、行号)

    1.设置字体大小和样式 打开设置:File-->Settings 看到如下界面,输入font,点击Editor目录下的Font设置字体大小和样式: Font:字体样式 size:字体大小 Fal ...

  8. 12、rpm

    1.什么是rpm 由红帽开发用于软件包的安装 升级 卸载 查询 2.rpm包是什么样? 组成部分是什么样的? zip-3.0-11.el7.x86_64.rpm #el7 zip-3.0-1. el6 ...

  9. 借助Charles来测试移动端-上篇

    随着现在互联网的兴起,移动端的测试需求越来越多,但是随着用户越来越多,迭代需求越来越频繁,或因为测试环境的接口不稳定,或因为多个业务系统互相关联,导致移动端测试后置,有时候提前介入了,也只能干耗时间, ...

  10. java8学习之比较器详解与类型推断特例

    比较器详解: 这次来对比较器进行一个学习,比较器(Comparator)这个是在JDK1.2就提出的概念,只是说JAVA8针对它进行了一定的扩充,更加方便咱们使用,其中唯一的抽象方法如下: 而JAVA ...