求助沿着基环树的环dfs时RE
  • 板块学术版
  • 楼主Missa
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/1/20 16:22
  • 上次更新2023/10/28 11:48:43
查看原帖
求助沿着基环树的环dfs时RE
443664
Missa楼主2022/1/20 16:22

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),边是双向边,所以 degdeg 存的是一个点连边的数量。

数据是:

(起点 终点 边权)
1 2 1 
1 3 1 
2 4 1 
2 5 1 
1 4 1

但是,将这份数据输入程序时会RE,具体是反复进入 dfs(2,4) 。后来,我在 dfs(v,u) 后加了 return 才让它不RE。

ss 输出,发现程序没找错环。因为基环树的环只有一个,而且 dfs 只能顺着环走,不加 return 应该不会RE啊,蒟蒻求解释。

2022/1/20 16:22
加载中...