tarjan

Posted shuiboke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tarjan相关的知识,希望对你有一定的参考价值。

#include <bits/stdc++.h>
#define MAXN 400010
using namespace std;
vector<int>v[MAXN];
bool sign[MAXN];
int dfn[MAXN],low[MAXN];
pair<int,int>belong[MAXN];
int num=0;
int tot=0;
int curr=0;
stack<int>sta;
void tarjan(int a/*,int pre*/)
{
    sta.push(a);
    sign[a]=true;
    dfn[a]=low[a]=++curr;
    for(int i=0;i<v[a].size();i++)
    {
        int b=v[a][i];
        if(!sign[b])
        {
            tarjan(b/*,a*/);
            low[a]=min(low[a],low[b]);
        }
        else //if(b!=pre)
            low[a]=min(low[a],dfn[b]);//感觉这地方的dfn[b]可以替换成low[b]
    }
    if(dfn[a]==low[a])
    {
        while(sta.top()!=a)
        {
            belong[num++]=make_pair(sta.top(),tot);
            sta.pop();
        }
        belong[num++]=make_pair(sta.top(),tot++);
        sta.pop();
    }
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int a,b;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        v[a].push_back(b);
    }
    for(int i=1;i<=n;i++)
        if(!sign[i])
            tarjan(i/*,i*/);
    if(n)
        printf("%d",belong[0].first);
    for(int i=1;i<num;i++)
    {
        if(belong[i].second==belong[i-1].second)
            printf(" %d",belong[i].first);
        else printf("\n%d",belong[i].first);
    }
    if(n)
        printf("\n");
    return 0;
}

如果去掉注释符号就是双向边的.

以上是关于tarjan的主要内容,如果未能解决你的问题,请参考以下文章

tarjan割点算法代码实现

tarjan(缩点)

洛谷 P2194 HXY烧情侣Tarjan缩点 分析+题解代码

关于tarjan

HDU 1269 迷宫城堡 tarjan算法求强连通分量

强连通图(tarjan)模板和详解