1. 程式人生 > 其它 >最短路徑生成樹

最短路徑生成樹

前言

為班刊而寫

首先,這個東西是一個非常冷門的知識點,模板題好像就是一道紫題(省選),但害怕考上了,於是,找了少有的部落格,整理一下

定義

我們知道最小生成樹是一個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊。最小生成樹可以用kruskal(克魯斯卡爾)演算法或prim(普里姆)演算法求出,俗話講,就是求一個圖,削成樹後,樹上留下邊權和最小

那麼,最短路徑生成樹是什麼?

最短路徑生成樹,就是ROOT根節點到達任意點距離最短的路徑所構成的樹,就是最短路徑生成樹

也就是說,最短路徑樹是一個根據根節點形成的每一個點到根節點距離最小的樹

知道了定義,那麼,最短路徑樹有何應用?----導航

求法

實際上,看到定義就知道,可以用,\(dijkstra\)來求最短路(這個不會的下面的也看不懂),至於路徑,就是在計算時記錄路,然後,在最後記下路徑就行了

實際上最短路徑生成樹最難的是記數,統計一共多少棵樹

這個實際上也是基於\(dijkstra\),在每次鬆弛時,對於如果相等時,就可以用一個數組記錄從原點到當前點最短的路徑的方案,最後,可以用乘法原理,統計出最後的答案

看到這,實際上,最短路徑樹是一個統計最短路徑的形式,甚至不是一個演算法,所以,題目一般都是變形過後的題目

例題

[HAOI2012]道路

題目描述

C 國有 n 座城市,城市之間通過 m 條單向道路連線。一條路徑被稱為最短路,當且僅當不存在從它的起點到終點的另外一條路徑總長度比它小。兩條最短路不同,當且僅當它們包含的道路序列不同。我們需要對每條道路的重要性進行評估,評估方式為計算有多少條不同的最短路經過該道路。現在,這個任務交給了你。

題目分析

首先對於這道題,可以對每一個點為根建一棵最小路徑樹,然後,樹上的邊實際上就是一個最短路徑的一條邊,於是,就可以對此貢獻,然後最後,用乘法原理統計答案即可