tarjan模板

	int tot,bel[MAXV+D];//tot代表强连通分量总数,bel数组代表点属于第几个连通分量
	int dfn[MAXV+D],low[MAXV+D],ind=0; 
	int stack[MAXV+D],top;
	bool ins[MAXV+D];
	void tarjan(int x)
	{
		dfn[x]=low[x]=++ind;
		ins[stack[++top]=x]=true;
		for(int i=head[x],y;i;i=e[i].next)
			if(!dfn[y=e[i].y])
			{
				tarjan(y);
				if(low[y]<low[x])
					low[x]=low[y];
			} 
			else if(ins[y]&&dfn[y]<low[x])
				low[x]=dfn[y];
		}
		if(dfn[x]==low[x])
		{
			int k;tot++;
		do{
			k=stack[top--];
			ins[k]=false;
			bel[k]=tot;
		}while(k!=x);
	}
}

  

posted @ 2018-04-05 20:42  mybing  阅读(127)  评论(0编辑  收藏  举报