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入队列。

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

  • 相关阅读:
    P3391 文艺平衡树
    隔离村庄(树形dp[01背包])
    cmd指令集
    vs的使用
    博客园第一天
    蓝桥杯 小生物的逃逸 模拟
    蓝桥杯 自行车停放 双向链表
    c++字符数组函数总结
    蓝桥杯 石子游戏 贪心
    蓝桥杯 最大获利 模拟
  • 原文地址:https://www.cnblogs.com/quintessence/p/6546921.html
Copyright © 2011-2022 走看看