版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Game_Acm/article/details/82354761
int tol,head[maxn];
struct edge
{
int to,id,next;
}es[maxm];
void addedge( int u , int v , int d )
{
es[tol].to = v;
es[tol].id = d;
es[tol].next = head[u];
head[u] = tol++;
}
int Low[maxn],Dfn[maxn],Stack[maxm],Belong[maxm];
int Index,Top,Block;
void dfs( int u , int f )
{
int v,line;
Low[u] = Dfn[u] = ++Index;
for ( int i=head[u] ; i!=-1 ; i=es[i].next )
{
v = es[i].to,line = es[i].id;
if ( v==f||Belong[line] ) continue;
if ( !Dfn[v] )
{
Stack[Top++] = line;
dfs( v , u );
if ( Low[u]>Low[v] ) Low[u] = Low[v];
if ( Low[v]>=Dfn[u] )
{
Block++;
int linen;
do
{
linen = Stack[--Top];
Belong[linen] = Block;
}while( linen!=line );
}
}
else if ( Dfn[v]<Dfn[u] )
{
Stack[Top++] = line;
if ( Dfn[v]<Low[u] ) Low[u] = Dfn[v];
}
}
}
void Tarjan()
{
memset ( Dfn , 0 , sizeof(Dfn) );
memset ( Belong , 0 , sizeof(Belong) );
Index = Block = Top = 0;
for ( int i=1 ; i<=n ; i++ )
if ( !Dfn[i] ) dfs( i , i );
}