什么是基环树?
n条边,n个点,连在一起,就变成了基环树
基环树如何求环?
有人用拓扑排序,但是如果不苛求时间复杂度,可以直接利用栈的思想和dfs进行找环
步骤?
第一步:寻找(任意)一个点进行一次dfs(1,0)
第二步:将所有dfs到的点,存入到栈中
第三步:直到发现连接的点已经访问过了,这时候就相当于找到了一个环
由于dfs的特性,这个时候你只是一直访问了一个路径,一直出栈,相当于就是在你dfs的路径上跳出刚才刚刚找到的点
一直出栈到你发现已经访问过的点
第四步:标记
第五步:对于每一个在环上的点,进行dfs(不在环上,且未dfs过的点)
这个时候dep数组就可以直接输出了
CF131D Subway
1 #include <cstdio> 2 3 const int MAXN=(int)1e4+5; 4 int ver[MAXN<<1],next[MAXN<<1],head[MAXN],tot; 5 6 void add(int u,int v){ 7