博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(最短路)17bupt新生赛——F. ch追妹
阅读量:5174 次
发布时间:2019-06-13

本文共 825 字,大约阅读时间需要 2 分钟。

 
时间限制 2000 ms 
内存限制 65536 KB

题目描述

n个点的一张无向图,每条边长度为wi,ch站在a点,ch要追的妹子站在b点。ch可以使用一次膜法,将一条边的长度变为0。ch想知道他要追到妹子要走的最短路径。

输入格式

第一行为数据组数T(T10)

每组数据的第一行为四个数 n,m,a,b(1a,bn10000,1m50000),分别表示点数,边数,ch的位置,妹子的位置。
之后m行,每行为三个数 u,v,w(1u,vn;1w10000),表示u,v之间有一条长度为w的无向边。数据保证没有重边和自环(即不会出现uu的边,也不会出现两条uv的边)。

输出格式

对每组数据输出一行,表示ch要走的最近距离。数据确保a可以到达b

输入样例

22 1 1 21 2 24 4 1 41 2 2 2 4 21 3 13 4 10

输出样例

0 1

与普通的最短路差别在于可以将一条边长度改为0,为此用d[x] x∈[1,n]表示没有进行将某条边长度改为0的操作时到某点x的最短路长度,d[x+n]表示进行过一次将某条边长度改为0的操作时到某点x

的最短长度。

下面分析一下何时更新值。

采用dijkstra算法,每次到一个点u时,d[u]是最短的,此时u的取值有两种可能,一种是<=n,另一种是>n

如果是<=n,那么此时还没有进行将某边改为0的操作,将从u点连出去的所有边进行2种判断,设某边连到v点,边长为x。

若d[v]>d[u]+x,将d[v]更新为d[u]+x,并push入队列

若d[v+n]>d[u],将d[v+n]更新为d[u],push入队列

如果>n

若d[v+n]>d[u]

d[v+n]=d[u]push入队列。

整个队列用优先队列的方式维护。

转载于:https://www.cnblogs.com/quintessence/p/6546921.html

你可能感兴趣的文章
CSS属性值currentColor
查看>>
Real-Time Rendering 笔记
查看>>
多路复用
查看>>
【UVA】434-Matty&#39;s Blocks
查看>>
hadoop2.2.0+hive-0.10.0完全分布式安装方法
查看>>
使用Reporting Services时遇到的小问题
查看>>
约瑟夫问题
查看>>
Arduino 报错总结
查看>>
树莓派Android Things物联网开发:树莓派GPIO引脚图
查看>>
矩阵快速幂---BestCoder Round#8 1002
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
有关快速幂取模
查看>>
NOI2018垫底记
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>
NSPredicate的使用,超级强大
查看>>