【模板】tarjan 基环树找环

void tarjan(int x,int from){
	dfn[x] = ++sz;
	for (int i = head[x]; ~i; i = fail[i]) {
		if (i == (from ^ 1)) continue;
		int v = edge[i];
		if (dfn[v]) {
			if (dfn[v] < dfn[x]) continue;
			cyc[x] = true;
			for (; v != x; v = father[v]){ cyc[v] = true;}
		}else father[v] = x, tarjan(v,i);
	}
}
posted @ 2021-09-11 19:21  Themaxmaxmax  阅读(85)  评论(0编辑  收藏  举报