low(u)=min edge[maxm*2];
int head[maxm*2],tot;
int low[maxn],dfn[maxn],belong[maxn];///belong 的值為1-scc
int index,top;
int scc ; ///強連通分量
bool instack[maxn];
int num[maxn],stack[maxn]; ///num為各個強連通分量包含的點的個數,陣列編號1-scc num陣列不一定需要,結合實際情況
void addedge(int u,int v)
void tarjan(int u) ///遍歷當前點u的鄰接所有點v
else if( instack[v] && low[u] > dfn[v]) ///當前點v之前被標記過 後向邊
low[u] = dfn[v]; ///這裡可以是low[u] = dfn[v] 不是low[v]
}if(low[u] == dfn[u]) ///找到乙個強連通分量
while(v!=u);
}}void solve(int n)
void init() ///如果陣列太大沒必要全部初始化
int main ()
{ int n,m,case=1;
while(~scanf("%d%d",&n,&m))
{int u,v;
init();
for(int i=0; i
強連通分量模板
知識背景 首先明確強連通分量 strongly connected component 的概念,從任一頂點能夠到達任一其他頂點的有向圖 的頂點子集,而任意有向圖均可以分解成若干不相交的scc。把每個scc視作乙個頂點,可得到乙個dag。實現演算法 兩次dfs,第一次 dfs 遍歷將頂點後序 post...
強連通分量 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...