[CSP-S模拟测试]:最小距离(最短路)
题目传送门(内部题97)
输入格式
第一行三个整数$n,m,p$,第二行$p$个整数$x_1\sim x_p$表示特殊点的编号。接下来$m$行每行三个整数$u,v,w$表示一条连接$u$和$v$,长度为$w$的边。
输出格式
输出一行$p$个整数,第$i$个整数表示$x_i$的答案。
样例
样例输入:
5 6 3
2 4 5
1 2 4
1 3 1
1 4 1
1 5 4
2 3 1
3 4 3
样例输出:
3 3 5
数据范围与提示
对于$10\%$的数据,$n,m\leqslant 50,000,p\leqslant 10$。
对于$40\%$的数据,$n,m\leqslant 50,000$。
对于另外$5\%$的数据,$p=n$。
对于$100\%$的数据,$1\leqslant n,m\leqslant 2\times 10^5,2\leqslant p\leqslant n,1\leqslant x_i\leqslant n$,$x_i$互不相同,$1\leqslant u,v\leqslant n,1\leqslant w\leqslant 10^9$。
题解
把每个点都放入堆里,然后跑最短路。
对于源点$i$,由$i$拓展的点$j$以及与$j$相邻且不由$i$拓展的点$k$,如果$i$的最优路径从$j$走到了$k$,那么走到拓展$k$的源点是最优的。
然后枚举每一条边更新答案即可。
时间复杂度:$\Theta(m\log n)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec{int nxt,to;long long w;}e[500000];
int head[200001],cnt=1;
int n,m,p;
int t[200001];
long long dis[200001],ans[200001],f[200001];
bool vis[200001];
priority_queue<pair<long long,int>,vector<pair<long long,int>>,greater<pair<long long,int>>>q;
void add(int x,int y,long long w)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
e[cnt].w=w;
head[x]=cnt;
}
void Dij()
{
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)
if(dis[e[i].to]>dis[x]+e[i].w)
{
dis[e[i].to]=dis[x]+e[i].w;
ans[e[i].to]=ans[x];
q.push(make_pair(dis[e[i].to],e[i].to));
}
}
}
int main()
{
memset(dis,0x3f,sizeof(dis));
memset(f,0x3f,sizeof(f));
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=p;i++)
{
scanf("%d",&t[i]);
q.push(make_pair(0,t[i]));
dis[t[i]]=0;ans[t[i]]=t[i];
}
for(int i=1;i<=m;i++)
{
int u,v;
long long w;
scanf("%d%d%lld",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
Dij();
for(int i=2;i<=cnt;i+=2)
{
int x=ans[e[i].to];
int y=ans[e[i^1].to];
if(x==y)continue;
f[x]=min(f[x],dis[e[i].to]+dis[e[i^1].to]+e[i].w);
f[y]=min(f[y],dis[e[i].to]+dis[e[i^1].to]+e[i].w);
}
for(int i=1;i<=p;i++)printf("%lld ",f[t[i]]);
return 0;
}
rp++
[CSP-S模拟测试]:最小距离(最短路)的更多相关文章
- csp-s模拟测试92
csp-s模拟测试92 关于$T1$:最短路这一定建边最短路. 关于$T2$:傻逼$Dp$这一定线段树优化$Dp$. 关于$T3$:最小生成树+树P+换跟一定是这样. 深入(?)思考$T1$:我是傻逼 ...
- [CSP-S模拟测试]:Star Way To Heaven(最小生成树Prim)
题目描述 小$w$伤心的走上了$Star\ way\ to\ heaven$. 到天堂的道路是一个笛卡尔坐标系上一个$n\times m$的长方形通道(顶点在$(0,0)$和$(n,m)$),小$w$ ...
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
- Android单元测试与模拟测试详解
测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...
- [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)
目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...
- 安装nginx python uwsgi环境 以及模拟测试
uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- 转 C#实现PID控制的模拟测试和曲线绘图
C#实现PID控制的模拟测试和曲线绘图 本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...
- Mockito:一个强大的用于Java开发的模拟测试框架
https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...
随机推荐
- 关于eclipse设置JRebel
版本:eclipse ee Version: 2018-09 (4.9.0) jrebel:最新2019-2 1.在eclipse->help->eclipse Marketplace 2 ...
- uoj #450[集训队作业2018]复读机
传送门 \(d=1\),那么任何时刻都可以\(k\)个复读机的一种,答案为\(k^n\) \(d>1\),可以枚举某个复读机的复读次数(必须是\(d\)的倍数),然后第\(i\)个复读时间为\( ...
- ELK-全文检索技术-kibana操作elasticsearch
前言:建议kibana语法一定要学好! 1 软件安装 1.1 ES的安装 第一步:解压压缩包,放到一个没有中文没有空格的位置 第二步:修改配置文件 1. jvm.options ...
- Vue的双向数据绑定的原理
Vue数据双向绑定的原理就是采用数据劫持结合发布者-订阅者模式,通过object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监 ...
- redis之使用场景
随着数据量的增长,MySQL 已经满足不了大型互联网类应用的需求.因此,Redis 基于内存存储数据,可以极大的提高查询性能,对产品在架构上很好的补充.在某些场景下,可以充分的利用 Redis 的特性 ...
- 查看 MySQL 数据库的编译参数
grep CONFIGURE_LINE /app/mysql/bin/mysqlbug 提示:还发现很多人先 cat,在 grep,很不专业,应杜绝. 范例 3: [root@VM-001~]# gr ...
- 使用window10系统搭建完善的Linux开发环境
https://juejin.im/post/5d22e46ee51d45775746b9b1 导读 在使用window系统开发时由于系统环境和线上环境不一致可能导致各种问题,以及部分扩展库只支持li ...
- Win7 Linux双系统,恢复Linux启动项
在一台电脑上安装Win7 Centos双系统,先安装Win,再安装Centos7.装完后,丢失Linux启动项. 恢复步骤,下载EasyBCD,添加新条目,操作系统选择Linux/BSD,类型选择GR ...
- python + excel 使用
为了提高工作效率(偷懒),用python去解决. 工作需要,需要将excel文件转化为csv文件,要是手工的一个个去转换,每个sheet页不但有几十个字段,中间还夹杂着空格,然后按顺序转换成csv文件 ...
- 费用流 Dijkstra 原始对偶方法(primal-dual method)
简单叙述用Dijkstra求费用流 Dijkstra不能求有负权边的最短路. 类似于Johnson算法,我们也可以设计一个势函数,以满足在与原图等价的新图中的边权非负. 但是这个算法并不能处理有负圈的 ...