次短路徑與次小生成樹問題的簡單解法

2022-07-08 19:48:10 字數 1270 閱讀 4393

次短路徑可以看作是k短路徑問題的一種特殊情況,求k短路徑有yen演算法等較為複雜的方法,對於次短路徑,可以有更為簡易的方法。下面介紹一種求兩個頂點之間次短路徑的解法。

我們要對乙個有向賦權圖(無向圖每條邊可以看作兩條相反的有向邊)的頂點s到t之間求次短路徑,首先應求出s的單源最短路徑。遍歷有向圖,標記出可以在最短路徑上的邊,加入集合k。然後列舉刪除集合k中每條邊,求從s到t的最短路徑,記錄每次求出的路徑長度值,其最小值就是次短路徑的長度。

在這裡我們以為次短路徑長度可以等於最短路徑長度,如果想等,也可以看作是從s到t有不止一條最短路徑。如果我們規定求從s到t大於最短路徑長度的次短路徑,則答案就是每次刪邊後大於原最短路徑的s到t的最短路徑長度的最小值。

用dijkstra+堆求單源最短路徑,則每次求最短路徑時間複雜度為o(nlog(n+m) + m),所以總的時間複雜度為o(nm*log(n+m) + m^2)。該估計是較為悲觀的,因為一般來說,在最短路徑上的邊的條數要遠遠小於m,所以實際效果要比預想的好。

模擬上述次短路徑求法,很容易想到乙個「列舉刪除最小生成樹上的每條邊,再求最小生成樹」的直觀解法。如果用prim+堆,每次最小生成樹時間複雜度為o(nlog(n+m) + m),列舉刪除有o(n)條邊,時間複雜度就是o(n^2log(n+m) + n*m),當圖很稠密時,接近o(n^3)。這種方法簡易直觀,但我們有乙個更簡單,而且效率更高的o(n^2+m)的解法,下面介紹這種方法。

首先求出原圖最小生成樹,記錄權值之和為minst。列舉新增每條不在最小生成樹上的邊(u,v),加上以後一定會形成乙個環。找到環上權值第二大的邊(即除了(u,v)以外的權值最大的邊),把它刪掉,計算當前生成樹的權值之和。取所有列舉修改的生成樹權值之和的最小值,就是次小生成樹。

具體實現時,更簡單的方法是從每個節點i遍歷整個最小生成樹,定義f[j]為從i到j的路徑上最大邊的權值。遍歷圖求出f[j]的值,然後對於新增每條不在最小生成樹中的邊(i,j),新的生成樹權值之和就是minst + w(i,j) - f[j],記錄其最小值,則為次小生成樹。

該演算法的時間複雜度為o(n^2 + m)。由於只用求一次最小生成樹,可以用最簡單的prim,時間複雜度為o(n^2)。演算法的瓶頸不在求最小生成樹,而在o(n^2+m)的列舉加邊修改,所以用更好的最小生成樹演算法是沒有必要的。

haoi 2005 路由選擇問題 直接求次短路徑。

pku 3255 roadblocks 稍微特殊的次短路徑,允許邊重複走。

ural 1416 confidential 求次小生成樹的問題、

pku 1679 the unique mst 判斷最小生成樹是否唯一。

source:

最小生成樹與次小生成樹

題意 給出兩個不同方案,每個方案使得所有的城堡被連通 形成連通圖 同時使邊權之和盡量小,問第乙個方案與第二個方案的大小關係。解題思路 因為m個橋能使n個城堡聯通,而兩個大爺的方案中至少存在乙個橋不相同,那麼我們判斷這是乙個求次小生成樹的方法。求次小生成樹模板 列舉 刪邊 再求mst複雜度有點高,看題...

次小生成樹

演算法引入 設g v,e,w 是連通的無向圖,t是圖g的一棵最小生成樹 如果有另一棵樹t1,滿足不存在樹t t t1 則稱t1是圖g的次小生成樹 演算法思想 鄰集的概念 由t進行一次可行交換得到的新的生成樹所組成的集合,稱為樹t的鄰集,記為n t 設t是圖g的最小生成樹,如果t1滿足 t1 min,...

次小生成樹

分類 圖論 2013 02 12 15 03 32人閱讀收藏 舉報次小生成樹 在求最小生成樹時,用陣列path i j 來表示mst中i到j最大邊權。求完後,直接列舉所有不在mst中的邊,把它加入到mst中構成一棵新的樹,且該樹有環,此環是由剛加入的邊 i,j 造成的,所以可以通過刪除path i ...