【複習圖論】如何找出一個強連通圖的奇環

如何找出一個強連通圖的奇環 這個問題來自於《算法概論》的課後習題,我想了2天,最後想出一個可行的辦法。 首先,對於環的問題,有兩個常規的手段,一個是點染色,還有一個是利用邊的分類。邊的分類主要是肯定出環的存在性(或位置),而染色,則是區分奇環和偶環的關鍵,這也是我最後纔想到的。 假定強連通有向圖G的根是r,設r爲紅色,那麼,咱們從r出發,每走一步,就把腳下的點染色爲上一個點的相反的顏色(紅變藍,藍變紅),而且,曾經染色過的點能夠重複染色。假設G有一個奇環,設這個奇環爲v0,v1,v2.。。vn,v1.。。。而後,咱們會發現,存在一個從r出發的路徑,使得v1被染色爲紅色,同時,也絕對存在一個從r出發的路徑,使得v1被染色爲藍色。緣由是,v1處於一個奇環當中,咱們能夠藉助它來實現這個效果。反過來講,假設存在一個從r出發的路徑,使得某個點vk被染色爲紅色,同時也存在一個從r出發的路徑,使得vk被染色爲藍色,那麼,咱們能夠判定,一定存在一個包含vk的奇環,這個結論也不難理解。因此,咱們就證實瞭如下結論: 強連通有向圖G含有奇環 等價於 從r出發,可使得某個vk被染色爲紅色,而且也能夠被染色爲藍色。 若是某個vk既能夠是紅色,又能夠是藍色,就意味着,它的前繼結點也知足這個有趣的性質:既能夠是紅色也能夠是藍色。把這個性質一直往前推,就能夠知道,r一定既能夠是紅色又能夠是藍色! 若是一條路徑會使得某個點曾經被染色爲紅色和藍色,那麼這個路徑咱們稱爲有趣路徑。 由上面的討論知道,有趣路徑的存在性與奇環的存在性,是等價的。 而後,咱們從邊的分類去分析。 假設T是G的dfs生成樹。顯然,T裏的點是紅藍相間,梅花間竹的。 也就是說,若是沒有那些前向邊,反向邊和橫插邊,不管咱們怎麼走,都走不出一條有趣路徑。而後,咱們逐條邊地往T上面增長。 假如咱們增長的是前向邊, (1)前向邊的兩個端點顏色相反,仍是沒有有趣路徑。 (2)不然,立刻就能夠獲得一條有趣路徑。 假如咱們增長的是前向邊, (1)前向邊的兩個端點顏色相反,仍是沒有有趣路徑。 (2)不然,立刻就能夠獲得一條有趣路徑。 假如咱們增長的是反向邊, (1)反向邊的兩個端點顏色相反,仍是沒有有趣路徑。 (2)不然,立刻就能夠獲得一條有趣路徑。 假如咱們增長的是橫叉邊, (1)橫叉邊的兩個端點顏色相反,仍是沒有有趣路徑。 (2)不然,立刻就能夠獲得一條有趣路徑。 能夠發現,只要碰到了兩端點顏色相同的某條非樹邊,就立刻能夠肯定一條有趣路徑,從而立刻知道奇環的存在。 反過來講,若是奇環存在,就必定能夠找到兩端點顏色相同的某條非樹邊,由於找不到的話,就確定不存在有趣路徑,也就不存在奇環了。 因此,這個尋找強連通圖G的奇環的算法就是: 對G進行dfs,同時染色,若是發現兩端點顏色相同的某條非樹邊,就說明有奇環,否則,就說明沒有奇環。 題外話: 圖的問題,拆分強連通分支,邊的分類,刪除邊,增長邊(特別是往dfs和bfs樹上面進行的增長邊操做),刪除點,增長點,還有染色,記錄訪問和離開時間,某個子圖的首個被訪問的點,這些都是很重要的思考方向。
相關文章
相關標籤/搜索