【模板】tarjan

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int sum,n,m,dfn[N],col[N],vis[N],cnt,low[N],degree[N];
vector<int>G[N];
stack<int>st; 
void tarjan(int u)
{
    dfn[u]=low[u]=++cnt;
    vis[u]=1;
    st.push(u);
    for(int i=0;i<G[u].size();i++)
    {
        int v=G[u][i];
        if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
        else if(vis[v]) low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u])
    {
        int v=u;
        ++sum;
        do
        {
            v=st.top();
            vis[v]=0;
            col[v]=sum;
            st.pop();
        }while(u!=v);
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1,u,v;i<=m;i++){
        cin>>u>>v;
        G[u].push_back(v);
    }
    for(int i=1;i<=n;i++){
        if(!dfn[i]){
            tarjan(i);
        }
    }
    
}
强联通分量

 

posted @ 2019-08-28 13:01  Dorom  阅读(82)  评论(0)    收藏  举报