9.23
popular cows
題目大意:
有n隻牛,牛a認為牛b很牛,牛b認為牛c很牛。給你m個關係(誰認為誰牛),求大家都認為它很牛的牛有幾隻。ps:如果牛a認為牛b很牛,牛b認為牛c很牛。那麼我們就認為牛a認為牛c很牛。
學習目標:
強連通分量分解(或稱縮點)的kosaraju演算法
演算法解釋:
強連通分量分解
對於乙個有向圖頂點的子集s,如果在s內任取兩個頂點u和v,都能找到一條從u到v的路徑,那麼就稱s是強連通的。如果在強連通的頂點集合s中加入其他任意頂點集合後,它都不再是強連通的,那麼就稱s是原圖的乙個強連通分量scc(stronglyconnectedcomponent)。任意有向圖都可以分解成若干個不相交的強連通分量,這就是強連通分量的分解。把分解後的強連通分量縮成乙個頂點,就得到乙個dag(有向無環圖)。
kosaraju演算法:
強連通分量分解可以通過兩次簡單的dfs實現。
第一次dfs時,選取任意頂點作為起點,遍歷所有尚未訪問過的頂點,並在回溯前給頂點標號(後序遍歷)。對剩餘的未訪問過的頂點,不斷重複上述過程。完成標號後,越接近圖的尾部(深度優先搜尋樹的葉子),頂點的標號越小。
第二次dfs時,先將所有邊反向,然後以標號最大的頂點為起點進行 dfs。這樣dfs所遍歷的頂點集合就構成了乙個強連通分量。之後,只要還有尚未訪問的頂點,就從中選取標號最大的頂點不斷重複上述過程。
題解:用強連通分量分解,找出其中出度為0的頂點即為紅人。
這些**是本人千辛萬苦寫出來的,借鑑即可,請勿抄襲,故用,請原諒。
強連通分量 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 下圖中,子圖為乙個強連通分量,因為...