Tarjan板子们

缩点

inline void tarjan(int u){
	dfn[u]=low[u]=++tarclock;
	vis[u]=1;
	s.push(u);
	for(int i=head[u];i!=-1;i=e[i].next){
		int v=e[i].v;
		if(!dfn[v]){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(vis[v])low[u]=min(low[u],low[v]);
	}
	if(low[u]==dfn[u]){
		sum++;
		while(1){
			int x=s.top();
			s.pop();
			vis[x]=0;
			color[x]=sum;
			num[color[x]]++;
			if(x==u)break;
		}
	}
}

割点

inline void tarjan(int u,int fa){
	low[u]=dfn[u]=++time;
	int child=0;
	for(int i=head[u];i!=-1;i=e[i].next){
		int v=e[i].v;
		if(!dfn[v]){
			tarjan(v,fa);
			low[u]=min(low[u],low[v]);
			if(low[v]>=dfn[u]&&u!=fa)cut[u]=1;
			if(u==fa)child++;
		}
		low[u]=min(low[u],dfn[v]);
	}
	if(child>=2&&u==fa)cut[u]=1;
}

割边

LCA

posted @ 2019-11-03 15:15  Y15BeTa  阅读(154)  评论(0编辑  收藏  举报