码迷,mamicode.com
首页 > 其他好文 > 详细

模板——Tarjan

时间:2016-11-16 19:13:55      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:scan   模板   ios   bool   vector   cstring   for   std   end   

#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
const int maxn=2000;
vector<int>tu[maxn];
vector<int>lt[maxn];
int n,m,lts=0;
int js=0;
int dfn[maxn],low[maxn];
int zhan[maxn],top=0;
bool isins[maxn];
void tarjan(int i)
{
    int j;
    dfn[i]=low[i]=++js;
    isins[i]=1;
    zhan[top++]=i;
    for(int j=0;j<tu[i].size();j++)
    {
        int tp=tu[i][j];
        if(dfn[tp]==-1)
            tarjan(tp),
            low[i]=min(low[i],low[tp]);
        else if(isins[tp])
            low[i]=min(low[i],dfn[tp]);
    }
    if(dfn[i]==low[i])
    {
        lts++;
        do{
            j=zhan[--top];
            isins[j]=0;
            lt[lts].push_back(j);
        }while(i!=j); 
    }
}
void solve(int n)
{
    memset(dfn,-1,sizeof dfn);
    memset(low,-1,sizeof low);
    memset(zhan,-1,sizeof zhan);
    memset(isins,0,sizeof isins);
    for(int i=0;i<n;i++)
        if(dfn[i]==-1)
            tarjan(i);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        tu[x].push_back(y);
    }
    solve(n);
    for(int i=1;i<=lts;i++)
    {
        cout<<i<<":";
        for(int j=0;j<lt[i].size();j++)
            cout<<lt[i][j]<<" ";
        cout<<endl; 
    }
    return 0;
}

 

模板——Tarjan

标签:scan   模板   ios   bool   vector   cstring   for   std   end   

原文地址:http://www.cnblogs.com/xiaoningmeng/p/6070615.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!