【藍橋杯】觀光鐵路(SPFA演算法運用於非最短路問題)
問題描述
跳蚤國正在大力發展旅遊業,每個城市都被打造成了旅遊景點。
許多跳蚤想去其他城市旅遊,但是由於跳得比較慢,它們的願望難以實現。這時,小C聽說有一種叫做火車的交通工具,在鐵路上跑得很快,便抓住了商機,創立了一家鐵路公司,向跳蚤國王請示在每兩個城市之間都修建鐵路。
然而,由於小C不會扳道岔,火車到一個城市以後只能保證不原路返回,而會隨機等概率地駛向與這個城市有鐵路連線的另外一個城市。
跳蚤國王向廣大居民徵求意見,結果跳蚤們不太滿意,因為這樣修建鐵路以後有可能只遊覽了3個城市(含出發的城市)以後就回來了,它們希望能多遊覽幾個城市。於是跳蚤國王要求小C提供一個方案,使得每隻跳蚤坐上火車後能多遊覽幾個城市才回來。 小C提供了一種方案給跳蚤國王。跳蚤國王想知道這個方案中每個城市的居民旅遊的期望時間(設火車經過每段鐵路的時間都為1),請你來幫跳蚤國王。
輸入格式
輸入的第一行包含兩個正整數n、m,其中n表示城市的數量,m表示方案中的鐵路條數。
接下來m行,每行包含兩個正整數u、v,表示方案中城市u和城市v之間有一條鐵路。
保證方案中無重邊無自環,每兩個城市之間都能經過鐵路直接或間接到達,且火車由任意一條鐵路到任意一個城市以後一定有路可走。
輸出格式
輸出n行,第i行包含一個實數
樣例輸入
4 5
1 2
2 3
3 4
4 1
1 3
樣例輸出
3.333333333333
5.000000000000
3.333333333333
5.000000000000
資料規模和約定
對於10%的測試點,n <= 10;
對於20%的測試點,n <= 12;
對於50%的測試點,n <= 16;
對於70%的測試點,n <= 19;
對於100%的測試點,4 <= k <= n <= 21,1 <= u, v <= n。資料有梯度。
解決過程
仔細一看,這根本就不是最短路問題嘛。
讓我們簡化一下問題
只求 的 情形。
問題變成,對於城市來說,出發回到原點的期望時間是多少?
首先,要明確幾件事情
引理一
對於出發點城市來說,出發到每個子節點的概率之和(出度)與父節點到本節點的概率之和(入度)相等,且為1。
這裡的出度和入度,都是借用網路流概念。
很顯然,城市1即是起點也是終點。
也就是說,乘客一定會回到原點,即使時間是
引理二 加權平均
對於概率與相對應的值
它們的平均期望應該是
這個平均期望對應的概率是
對於某個節點
到達的平均期望就是,到達的概率就是
(如果以父節點的時間計算的話k的平均期望就是)
而這道題中有這麼一個性質
性質:子節點不會影響父節點,父節點只會影響子節點。
這個性質可能看起來不怎麼樣。
讓我們回想一下SPFA演算法對Bellman - Ford演算法的最大優化在哪?
對某個節點鬆弛操作後,只有這個節點的子節點受到了影響。
對了
這就是SPFA的核心思想
於是我們可以得出求解城市1的了
步驟
- 建立兩個陣列,概率,時間,為城市節點。顯然
- 城市1入隊,指標指向城市1.
- 除了城市1,如果 那麼跳到步驟7。否則繼續執行步驟4。
- 計運算元節點的數量和平分給子節點的概率
- 對於所有在佇列內的子節點(如果城市1是子節點那麼也算在佇列內,雖然實際並不在內),計算並賦值加權平均