割点、强连通分量

算是之前的DFS树的一个具体应用,写个模板。

割点:

void DFS(int u) {
	dfn[u] = low[u] = ++ind;
	
	int childnum = 0;
	if(u == root) childnum = -1;
	
	for(int i = first[u]; i; i = e[i].next) {
		int v = e[i].to;
		
		if(!dfn[v]) {
			DFS(v), low[u] = min(low[u], low[v]);
			if(low[v] == dfn[u]) ++childnum;
		}
		else low[u] = min(low[u], dfn[v]);
	}
	
	if(childnum >= 1) p[++cnt] = u;
}

强连通分量:

void DFS(int u) {
	dfn[u] = low[u] = ++ind;
	sta[++top] = u, insta[u] = 1;
	
	for(auto v : to[u]) {
		if(!dfn[v]) DFS(v), low[u] = std::min(low[u], low[v]);
		else if(insta[v]) low[u] = std::min(low[u], dfn[v]);
	}
	
	if(low[u] == dfn[u]) {
		++cnt;
		while(sta[top] != u){
			scc[sta[top]] = cnt;
			insta[sta[top--]] = 0;
		}
		scc[sta[top]] = cnt;
		insta[sta[top--]] = 0;
	}
}

(因为两个板子写的时间相距较长,码风差距较大,凑合着看吧。。。)

posted @ 2020-08-21 21:58  whx1003  阅读(138)  评论(0编辑  收藏  举报