1. 程式人生 > 其它 >0階段-第四日-tarjan演算法在圖的連同性中的運用。

0階段-第四日-tarjan演算法在圖的連同性中的運用。

人不摸,就會死。
第四日,tarjan演算法在圖的連同性中的運用。

自上至下對應內容為:
全部基於tarjan演算法實現:
1、求強連通分量,縮點,拓撲排序
2、割點
3、縮點
4、添邊使圖強連通,縮點
5、無向連通圖轉強連通圖(規定邊方向),橋 6、同3 7、類似於4 8-10、裸2-SAT
所學整理如下:
0、前置
設無向連通圖為G,構造形成DFS樹為T,規定邊方向形成有向圖為G。設T中某一條樹邊為uv,孩子為v,父親為u,以該孩子為根的子樹集合為U,T中所有節點的公共祖先為集合為S,S刪去u的的集合為S
1、橋、連通無向圖轉強連通圖
1、當然是在無向連通圖G中討論
2、把圖構造成任意一顆一顆dfs樹T,兩者當然是等價的。
3、回邊不可能是橋,橋只能樹邊,若有重邊或自環,則它們為回邊。
4、每一個回邊對應樹上的一個簡單路徑,可視該簡單路徑中的每一條樹邊被回邊覆蓋。縱觀整張圖,被覆蓋的樹邊和回邊不可能是橋,沒有被覆蓋的樹邊必定為橋(形象點就是沒有回邊從它頭上跨過去)。被覆蓋的邊uv,意味者v可以不經過uv,從經過回邊可以回到S中。
5、沒覆蓋的邊uv就是橋,也就是說v不通過橋,就無法回到S中。
6、容易證出,對於v,如果U中沒有沒有回邊連線S,那麼uv就是橋。 7、如果有回邊連線S,那麼uv必不是橋。
8、這樣就能通過low傳遞U中回邊指向的時間戳,來判斷6、7。
8、給樹邊uv規定方向:u->v;給回邊規定方向:指向祖先。這樣就構造除了G。
9、如果G中沒有有橋,那麼對於v,總能通過U中的一條回邊回到S,也就意味這G中,該從u到v後,v總能通過規定方向的回邊回到它的祖先。也就是說除了G

中根節點外的任何一個節點都能能往樹根方向回溯,最終輾轉回到根節點,而根節點又可以到圖上的每一個節點,所以該圖強連通。
10、如果有橋,那必然非強連通。
如圖(源自OI WIIK)

2、 割點
0、先不考慮樹根
1、割點,刪除去該點後,無向連通圖被劃分為兩個連通塊。
2、等價於v通過U中回邊最多能回到u,等價於v通過U無法回到S
3、橋是做多回到S,而割點是S

4、所以判斷的時候加一個等於就好。
5、特例:根。對於根的所有孩子,S*是空集,也就是說根的孩子只要有兩個或以上,那必然是割點。而其它節點由於必有父節點,如果有孩子一個以上,那麼滿足條件就是割點。所以根要特判。
3、有向圖填邊構造強連通圖的方法


max(出度為0的縮點數,入讀為0的縮點數) 。圖本身就是強連通需要特判。
**4、2-SAT **
通俗的說,就是命題邏輯題。就是給你一個一些限制條件,要你找成真賦值。例如:
限制條件:(a|b)&!(a&b)&(a->c)
要求就是判斷成真賦值是否存在。
首先利用基本等式轉化一下:
a|b<=>(!a->b)&(!b->a)
!(a&b)<=>!a|!b<=>(a->!b)&(b->!a)
a->c<=>(a->c)&(!c->!a)
即:
(a|b)&!(a&b)&(a->c)<=>(!a->b)&(!b->a)&(a->!b)&(b->!a)&(a->c)&(!c->!a)
限制條件就變成了後者。
把它化成一張圖:

至於為什麼是p|q<=>(!p->q)&(!q->p)而不是p|q<=>(!p->q),這樣在圖中對應只連上一條邊。我想是為了保證通過圖構造的解的真確性。否則約束不夠強得不出正確答案。
圖中的邊當然還是蘊含連線詞,我們只是把它畫成了圖。
我們根據圖來尋找成真賦值:
1、如果強連通分量中,的所有命題真值相同,由假言推理很容易看出。
2、由此顯然,如果強連通分量中包含某一命題q,同時又包含命題!q,那麼不存在一個成真賦值。
3、對任意p,都和!p不在一個強連通分量中,那麼成真賦值一定存在,沒有證明。
4、在用tarjan演算法找強連通分量的過程中,同時給每個強連通分量打上拓撲排序的逆序,用scc[]記錄這個逆序。如果誰的scc小就給誰賦值為真(如果打上的正序,那就大的為真)。可以保證這樣的方式構造的解總是存在的.例如scc[!q]<scc[q],那麼就另!q=1,q=0。對每個命題這麼操作後我們就可以得到一個滿足限制條件的解。
5、做這類題目的關鍵就是把題目轉化為邏輯命題進行分析。