不適合初學者,適合複習
縮點
就是一個序。
是不通過的父親節點能到達的最高(深度最小/序最小)的祖先節點。
上面兩個數組初始化都是序編號;解釋:顯然,一開始每個點的就是自己,也是序。
然後遍歷與之相鄰的點:
- 如果這個點之前沒被訪問過,就先繼續往下遞歸,回溯回來時用下面點的更新當前這個點的,取下面點的最小值,因爲這個點可以走到這些點,按照的定義需要取。
- 如果這個點被訪問過,那就直接用棧裏(已經求出的強連通分量)的點的更新當前點的,因爲這個點可以到達這些點(因爲棧裏的點已經是求出的一個強連通分量)。
遍歷完這些點之後如果當前節點的,那就說明這個節點的子節點已經沒有返祖邊了,當前點和當前點的子節點都沒有邊指向更早的祖先,所以說這個點當前的強連通分量是最大的(爲什麼求出的強連通分量是最大的)。
記錄從棧裏彈出來的點就是一個強連通分量(環),然後就可以縮點了。
注意圖不一定聯通,所以要對每個沒搜過的點都跑一遍,判斷是否有值即可。
割點與橋的判斷
割點和橋是對於無向圖而言的。
有割點不一定有橋但有橋一定有割點,可以自己畫圖嘗試一下。
對於割點,如果當前節點的子樹裏有一個節點必須通過當前節點才能訪問到的祖先借節點,那麼就是一個割點,因爲去掉之後就與上面的點不連通了。
也就是在回溯回來時判斷,根節點要單獨考慮,看是否有一棵以上子樹即可。
橋與割點只是點與邊的區別,橋就是判斷,去掉了相等的情況。