RT
void find(){ //找环
for(int i = 1; i <= n; i++) if(deg[i] == 1) q.push(i);
while(!q.empty()){
int u = q.front(); q.pop(); vis[u] = 1;
for(int i = head[u]; i; i = e[i].nxt){
int v = e[i].to; deg[v]--;
if(deg[v] == 1) q.push(v);
}
}
for(int i = 1; i <= n; i++) if(!vis[i]) s.push_back(i), circle[i] = 1;
}
void dfs(int u, int fa){ //标记环
for(int i = head[u]; i; i = e[i].to){
int v = e[i].to;
if(v == fa || !circle[v]) continue;
if(v == s[0]) {L = g[u] + e[i].w; return;}
g[v] = g[u] + e[i].w;
dfs(v, u); return; //后面说的return是这个
}
}
在主函数的调用是先调用 find
再调用 dfs(s[0],0)
,边是双向边,所以 deg 存的是一个点连边的数量。
数据是:
(起点 终点 边权)
1 2 1
1 3 1
2 4 1
2 5 1
1 4 1
但是,将这份数据输入程序时会RE,具体是反复进入 dfs(2,4)
。后来,我在 dfs(v,u)
后加了 return
才让它不RE。
将 s 输出,发现程序没找错环。因为基环树的环只有一个,而且 dfs
只能顺着环走,不加 return
应该不会RE啊,蒟蒻求解释。