zoukankan      html  css  js  c++  java
  • 最短路径可行边

    给定图G,求u-v的最短路径可行边。

    u-v的最短路径可行边:存在一条u-v的最短路径经过这条边。

    与之相对应的是最短路径必须边:任意一条最短路径都必须经过的边。本文不探讨该问题。

    首先求出u为起点的单源最短路径(Dijkstra或者SPFA随意),以dis[x]表示u到x的最短距离。

    然后明确一个充分必要条件:一条边a->b是u->b的最短路径可行边的 充分必要条件是 dis[a]+w[a->b]=dis[b]。(由最短路径的定义和性质显而得证)

    进而,我们判断v的所有入边x->v是否为u->v的最短路径可行边。若是:则将x加入队列,并将这条边标记为u->v的最短路径可行边。

    然后从队列中取元素x并求u->x的最短路径可行边,这条u->x的可行边也是u->v的可行边,标记这条边,并将 入点 加入队列。重复此过程直至队列为空,所有标记的边即为u->v的可行边。

    对了注意不要将一个点重复加入队列。

    喜闻乐见的综合性题目:Marriage Match IV HDU - 3416

    对于这题可以先看下这篇题解:https://www.cnblogs.com/xiuwenli/p/9326457.html

    题解求的S(源点)到任意一点的最短路径可行边来建立网络流模型,我们实际需要的是S->T(汇点)的可行边来建立网络流模型。那么这样扩充边是否会使答案错误?

    答:不会。

    证明:

      若一条边a->b是S->T的最短路径可行边,那么它也一定是S->b的最短路径可行边,因为最短路径由最短路径组成这条性质。所以所有S->T的可行边都求出来了。

      若一条边a->b仅仅是S->b的可行边,那么说明没有最S->T的最短路径经过b(若有,则a->b也是S->T的最短路径可行边),那么不存在由b出发的边,也就说明在网络流中流到b的流不会流出,即不存在流到b的可行流。所以这种可行边对网络流没影响。

    若这种证明不好理解,就直接求S->T的可行边来建立网络流模型吧。

    若有错误敬请指正!非常感谢!

     

  • 相关阅读:
    【Java并发】并发笔记(一)
    【深入Java基础】排序算法(一)
    QDU-GZS and String
    牛客网36-A,B题解
    QDU-GZS与素数大法(素数筛法)
    csdn自动展开+去广告+净化剪切板+免登陆(如有侵权,立即删博)
    QDU第一届程序设计大赛——E到I题解法(非官方题解)
    Codeforces Round #529 -C- Powers Of Two(二进制拆分)
    CodeForces
    分配物资(模拟)
  • 原文地址:https://www.cnblogs.com/dialectics/p/12346408.html
Copyright © 2011-2022 走看看