无向图中到环的距离
难度:
标签:
题目描述
代码结果
运行时间: 155 ms, 内存: 49.4 MB
/*
题目思路:
1. 使用BFS来寻找图中的环。首先,通过DFS找出所有的环中的节点。
2. 然后,通过BFS计算每个节点到最近环节点的距离。
3. 返回一个包含所有节点到最近环节点距离的数组。
*/
import java.util.*;
import java.util.stream.*;
class Solution {
public int[] distanceToCycle(int n, int[][] edges) {
List<List<Integer>> graph = IntStream.range(0, n)
.mapToObj(i -> new ArrayList<Integer>())
.collect(Collectors.toList());
for (int[] edge : edges) {
graph.get(edge[0]).add(edge[1]);
graph.get(edge[1]).add(edge[0]);
}
boolean[] visited = new boolean[n];
int[] parent = IntStream.generate(() -> -1).limit(n).toArray();
int[] cycleNodes = IntStream.generate(() -> -1).limit(n).toArray();
Deque<Integer> queue = new ArrayDeque<>();
findCycle(0, -1, visited, parent, graph, cycleNodes, queue);
int[] distances = IntStream.generate(() -> Integer.MAX_VALUE).limit(n).toArray();
queue.forEach(node -> distances[node] = 0);
while (!queue.isEmpty()) {
int node = queue.poll();
for (int neighbor : graph.get(node)) {
if (distances[neighbor] == Integer.MAX_VALUE) {
distances[neighbor] = distances[node] + 1;
queue.offer(neighbor);
}
}
}
return distances;
}
private boolean findCycle(int node, int parent, boolean[] visited, int[] parents, List<List<Integer>> graph, int[] cycleNodes, Deque<Integer> queue) {
visited[node] = true;
parents[node] = parent;
for (int neighbor : graph.get(node)) {
if (neighbor == parent) continue;
if (visited[neighbor]) {
int cur = node;
while (cur != neighbor) {
cycleNodes[cur] = 0;
queue.offer(cur);
cur = parents[cur];
}
cycleNodes[neighbor] = 0;
queue.offer(neighbor);
return true;
}
if (findCycle(neighbor, node, visited, parents, graph, cycleNodes, queue)) {
return true;
}
}
return false;
}
}
解释
方法:
此题解采用了两阶段的广度优先搜索(BFS)来解决问题。首先,第一阶段的BFS用于在无向图中找到一个环,并将环中的节点记录下来。初始时从节点0开始,利用数组`pa`记录每个节点的父节点,以避免向父节点反向遍历,从而检测到环。一旦检测到一个节点被重复访问(即形成环路),则回溯以确定环中的所有节点。第二阶段的BFS从环中的所有节点同时出发,以这些节点作为多源点,计算图中所有其他节点到最近的环中节点的最短距离。这里使用`vis`数组记录节点是否已被访问过,以避免重复处理。
时间复杂度:
O(V + E)
空间复杂度:
O(V + E)
代码细节讲解
🦆
在广度优先搜索中,如何确保不会对同一个节点进行重复访问或处理?
▷🦆
在寻找环的过程中,如果图中存在多个环,该算法如何决定哪个环会被检测到?
▷🦆
为什么在检测到环时,需要对环的完整路径进行回溯,而不是仅仅记录形成环的那两个节点?
▷🦆
在多源BFS执行过程中,如何处理图中孤立节点或与环不连通的节点?
▷