/*强连通分量tarjan算法*/
struct A
{
int next,v;
} edge[50010],;
int pre[MAX_N],instack[MAX_N],dfn[MAX_N],low[MAX_N],stack[MAX_N],belong[MAX_N],cnt_size[MAX_N];
int num,top,cnt;
void tarjan(int x)
{
int i,j,k;
dfn[x]=low[x]=++num;
stack[++top]=x;
instack[x]=1;
for (int i=h[x]; i!=-1; i=e[i].ne)
{
j=e[i].y;
if (dfn[j]==0)
{
tarjan(j);
low[x]=min(low[j],low[x]);
}
else if (instack[j]) low[x]=min(low[j],low[x]);
}
if (dfn[x]==low[x])
{
bcnt++;
do
{
j=stack[top--];
instack[j]=0;
cnt_size[cnt]++;//这个强连通分量有多少个点
belong[j]=bcnt;//属于哪个强连通分量
}
while (j!=x);
}
}
强连通分量tarjan
最新推荐文章于 2015-09-09 11:39:40 发布