從娃娃就開始學起最短路,我居然不會作!!算法
主要算法就三種(我只會三種): \(Floyd\),\(Dijkstra\),和已經死了的 \(SPFA\)數組
(其實 \(SPFA\) 有許多優化方式均可以卡掉,會在下一章裏講,這裏就不贅述)優化
洛谷中有這麼一道題P6175 無向圖的最小環問題和例題差很少spa
發現 \(n\) 的範圍很小,考慮用 \(Floyd\)。ip
由於 \(Floyd\) 是按照結點的順序更新最短路的,因此咱們在更新最短路以前先找到一個鏈接點 \(k\),當前的點 \(k\) 確定不存在於已存在的最短路 \(dis[i][j]\) 的路徑上,由於咱們還沒用這個 \(k\) 去更新最短路,至關於 ($i \to k \to j \to $ j $到 \(i\) 的最短路 \to i$)這樣一個環就找到了,接下來咱們要記錄路徑,用 \(path[i][j]\) 表示在最短路i到j的路徑上j的前一個結點,因此咱們在更新最短路時也要更新這個點,原來的最短路是 \(i -> j\),如今變成了 \(i -> k -> j\),因此有 \(per[i][j] = pre[k][j]\),由於要找最小環,因此不斷更新找到環的權值,環更新一次,路徑也要更新一次,路徑更新時根據 \(pre\) 數組迭代一下就 \(ok\) 了get
Codeclass