tarjan模板(帶註釋)

//dfsn[x]記錄x節點有沒有被訪問過,有,則是第幾個 
//lowlink[x]記錄x能到的祖先中編號最小的
//dfs_clock是個編號累計器 
//scc記錄一個 
inline void dfs_scc(int x)
{
    dfsn[x]=lowlink[x]=++dfs_clock;//訪問次序標記;x能到的祖先中節點編號最小的 
    stack[++top]=x;//把走過的節點入棧 
    for(int i=0;i<e[x].size();i++)
    {
        int now=e[x][i].to;
        if(!dfsn[now])//若是沒有被訪問過 
        {
            dfs_scc(now);//進它 
            lowlink[x]=min(lowlink[x],lowlink[now]);//既然now是x的子節點,那麼他們必定有公告的祖先,取個小的 
        } 
        else
        if(!scc[now])//若是他尚未被其餘強連通份量使用 
        lowlink[x]=min(lowlink[x],dfsn[now]);//那麼再小一點 
    }
    if(lowlink[x]==dfsn[x])
    {
        scc_cnt++;
        while(stack[top]!=x)//x節點在棧中夾着的節點就是強連通份量的節點 
        scc[stack[top--]]=scc_cnt;//哪個點在當前編號爲scc_cnt的強連通份量裏 
        top--;
        scc[x]=scc_cnt;//一個強連通份量 
    } 
}
相關文章
相關標籤/搜索