最短路径可行边

给定图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的可行边来建立网络流模型吧。

 

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

 

posted @ 2020-02-22 17:52  dialectics  阅读(181)  评论(0编辑  收藏  举报