Tarjan算法板子

来源:互联网 发布:win10优化用什么软件好 编辑:程序博客网 时间:2024/06/06 04:45
#include<iostream>#include<algorithm>#include<vector>using namespace std;const int maxn=10010;int dfn[maxn];int low[maxn];int vis[maxn];int stack[maxn];int color[maxn];int cnt=0;int size=0;int tot=0;vector<int> edge[maxn];void tarjan(int st){    dfn[st]=low[st]=++tot;    vis[st]=1;    stack[++size]=st;    for(int i=0;i<edge[st].size();i++){        int ed=edge[st][i];        if(!dfn[ed]){            tarjan(ed);            low[st]=min(low[st],low[ed]);        }        else if(vis[ed])            low[st]=min(low[st],dfn[ed]);    }    if(dfn[st] == low[st]){        cnt++;        do{            color[stack[size]]=cnt;            vis[stack[size]]=1;        }while(st!=stack[size--]);    }}int main(){    int n,m;    cin>>n>>m;    for(int i=1;i<=m;i++){        int x,y;        cin>>x>>y;        edge[x].push_back(y);    }    for(int i=1;i<=n;i++){        if(!dfn[i])            tarjan(i);    }    for(int i=1;i<=n;i++){        cout<<color[i]<<endl;    }    return 0;}


原创粉丝点击