1. 程式人生 > >【藍橋杯】觀光鐵路(SPFA演算法運用於非最短路問題)

【藍橋杯】觀光鐵路(SPFA演算法運用於非最短路問題)

問題描述

跳蚤國正在大力發展旅遊業,每個城市都被打造成了旅遊景點。
  許多跳蚤想去其他城市旅遊,但是由於跳得比較慢,它們的願望難以實現。這時,小C聽說有一種叫做火車的交通工具,在鐵路上跑得很快,便抓住了商機,創立了一家鐵路公司,向跳蚤國王請示在每兩個城市之間都修建鐵路。
  然而,由於小C不會扳道岔,火車到一個城市以後只能保證不原路返回,而會隨機等概率地駛向與這個城市有鐵路連線的另外一個城市。
  跳蚤國王向廣大居民徵求意見,結果跳蚤們不太滿意,因為這樣修建鐵路以後有可能只遊覽了3個城市(含出發的城市)以後就回來了,它們希望能多遊覽幾個城市。於是跳蚤國王要求小C提供一個方案,使得每隻跳蚤坐上火車後能多遊覽幾個城市才回來。 小C提供了一種方案給跳蚤國王。跳蚤國王想知道這個方案中每個城市的居民旅遊的期望時間(設火車經過每段鐵路的時間都為1),請你來幫跳蚤國王。
輸入格式
  輸入的第一行包含兩個正整數n、m,其中n表示城市的數量,m表示方案中的鐵路條數。
  接下來m行,每行包含兩個正整數u、v,表示方案中城市u和城市v之間有一條鐵路。
  保證方案中無重邊無自環,每兩個城市之間都能經過鐵路直接或間接到達,且火車由任意一條鐵路到任意一個城市以後一定有路可走。
輸出格式
  輸出n行,第i行包含一個實數

tBi,表示方案B中城市i的居民旅遊的期望時間。你應當輸出足夠多的小數位數,以保證輸出的值和真實值之間的絕對或相對誤差不超過1e-9。
樣例輸入
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。資料有梯度。

解決過程

仔細一看,這根本就不是最短路問題嘛。
讓我們簡化一下問題
只求 i=1的 情形。

問題變成,對於城市1來說,出發回到原點的期望時間是多少?

首先,要明確幾件事情

引理一

對於出發點城市1來說,出發到每個子節點的概率之和(出度)與父節點到本節點的概率之和(入度)相等,且為1。
這裡的出度和入度,都是借用網路流概念。
很顯然,城市1即是起點也是終點。
這裡寫圖片描述
也就是說,乘客一定會回到原點,即使時間是

引理二 加權平均

對於概率p1,p2pn與相對應的值x1,x2xn
它們的平均期望應該是

x¯=i=1npixii=1npi
這個平均期望對應的概率是p=i=1npi

對於某個節點k
這裡寫圖片描述
到達k的平均期望就是x¯,到達k的概率就是p
(如果以父節點的時間計算的話k的平均期望就是x¯+i=1npi1i=1npi=x¯+1)

而這道題中有這麼一個性質

性質:子節點不會影響父節點,父節點只會影響子節點。

這個性質可能看起來不怎麼樣。
讓我們回想一下SPFA演算法對Bellman - Ford演算法的最大優化在哪?
對某個節點鬆弛操作後,只有這個節點的子節點受到了影響
對了
這就是SPFA的核心思想

於是我們可以得出求解城市1的了

步驟

  1. 建立兩個陣列,概率p[i],時間x[i],i為城市節點。顯然p[1]=100%=1,x[1]=0
  2. 城市1入隊,指標i指向城市1.
  3. 除了城市1,如果p[i]x[i]<1E9(109) 那麼跳到步驟7。否則繼續執行步驟4。
  4. 計運算元節點的數量ni和平分給子節點的概率P=p[i]ni
  5. 對於所有在佇列內的子節點k(如果城市1是子節點那麼也算在佇列內,雖然實際並不在內),計算並賦值加權平均x[k]=(x[i]+1)P+x[k]p[k]P+p[k