zoukankan      html  css  js  c++  java
  • (最短路)17bupt新生赛——F. ch追妹

    
    
    
    时间限制 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

    输入样例

    2
    2 1 1 2
    1 2 2
    4 4 1 4
    1 2 2 
    2 4 2
    1 3 1
    3 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入队列。

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

  • 相关阅读:
    献给正在奋斗的人
    Delphi TRzTreeView 或者TRzCheckTree或者TTreeView离开焦点还显示灰色的选择状态
    笑话(三)
    王永庆建立企业奖励机制
    DbGridEh表格Tile居中,但是内容左对齐的做法
    DelPhi LockWindowUpdate的函数的用法
    Delphi DbgridEh实现鼠标拖动选中列,并使复选框选中
    国足输球,总结原因
    TPath
    TMemoryStream、String与OleVariant互转
  • 原文地址:https://www.cnblogs.com/quintessence/p/6546921.html
Copyright © 2011-2022 走看看