http://web2.ck.tp.edu.tw/~step5/probdisp.php?pid=0141
這題其實是圖論題,scc縮點後DFS最大值。
scc,強連通元件(或分量??),是指有向圖中一段圖任兩點互有路徑可以相通的狀態,如果在上面DFS可能會進入無限循環,所以可以用一些演算法把它們縮成一個點,一張爛圖上DFS就會轉換成樹DFS(縮點完一定是有權無環圖)。
先講一下題目,題目是說有一堆房子,你可以往比現在房子矮或一樣高的房子上走,如果房子上有噴射裝置,則可以順移到任意點,所有房子和噴射裝置都可以重複經過。題目要知道能走到最多幾間不一樣的房子。
可以轉成一張圖,可以從a房子->b房子就建一條有向邊,噴射裝置則是連到一個萬能點,萬能點連到全部的點,然後對這張圖縮點,每個scc的權重等於點權重的和(初始每個點權重都是1,萬能點是0)
我寫的時候遇到一些問題,第一就是因為不熟,code很醜,演算法還是要多練習。第二就是對於DFS概念不太正確,在搜有向無還圖時,有些點因為叉路,比如1到2、3,2、3再到4,那4以下就要DFS兩遍,多幾個這種叉路就TLE了,一定要注意優化(記錄走過的點的總權重,第二次走到直接取值)。
一些對scc理解有幫助的連結:
Kosaraju:
http://blog.csdn.net/zzran/article/details/8939851
http://greatpowerlaw.wordpress.com/2013/05/03/scc-kosarajus-algorithm/
Tarjan:
https://www.byvoid.com/blog/scc-tarjan
1 |
|