(雖然可能理解的並不深hhh)
上一次(暑假)我們初探了強聯通分量,這一次我們再探。(特別感謝pku-lyc老師的課件。有很多引用)
來丟幾道例題跑。
例題1 network
• n個學校之間有單向的網路(是有向連通圖),每個學校得到一
套軟體後,可以通過單向網路(有向邊)向周邊的學校傳輸。
• 問題1:初始至少需要向多少個學校發放軟體,才能使得網路內
所有的學校最終都能得到軟體。
• 問題2:至少需要新增幾條傳輸線路(邊),使任意向乙個學校發放
軟體後,經過若干次傳送,網路內所有的學校最終都能得到軟體。
問題簡化。
• 給定乙個有向連通圖,求:
• 1) 求乙個最小的頂點集,使得從這個頂點集出發,可以到達全部頂點
• 2) 至少要加多少條邊,才能從任何乙個頂點出發,都能到達全部頂點
• 1. 求出所有強連通分量
• 2. 每個強連通分量縮成一點,則形成乙個有向無環圖dag。
• 3. dag上面有多少個入度為0的頂點,問題1的答案就是多少
• 在dag上要加幾條邊,才能使得dag變成強連通的,問題2的答案
就是多少
• 加邊的方法:
• 為每個入度為0的點新增入邊,為每個出度為0的點新增出邊
• 假定有 n 個入度為0的點,m個出度為0的點,max(m,n)就是第二
個問題的解
* 另乙個性質
有向無環圖中所有入度不為0的點,一定可以由
某個入度為0的點出發可達。
例題2 間諜網路
戳這,裡面還有對縮點的一些小結。
本演算法容易錯的:縮點最後在scc_cnt上操作。
再探結束,日後也許會深探。(可別咕啊。)
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...
強連通分量
對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...
強連通分量
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...