检查边长度限制的路径是否存在 II
难度:
标签:
题目描述
代码结果
运行时间: 284 ms, 内存: 26.3 MB
/*
题目思路:
可以使用Dijkstra算法来寻找最短路径,同时维护一条边的最大长度限制。使用Stream API来处理数据。
*/
import java.util.*;
import java.util.stream.Collectors;
public class Solution {
class Edge {
int to, length;
Edge(int to, int length) {
this.to = to;
this.length = length;
}
}
public boolean pathWithLengthLimit(int n, int[][] edges, int limit, int start, int end) {
List<List<Edge>> graph = new ArrayList<>(Collections.nCopies(n, null)).stream().map(e -> new ArrayList<Edge>()).collect(Collectors.toList());
Arrays.stream(edges).forEach(edge -> {
graph.get(edge[0]).add(new Edge(edge[1], edge[2]));
graph.get(edge[1]).add(new Edge(edge[0], edge[2]));
});
PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
pq.offer(new int[]{start, 0});
int[] dist = new int[n];
Arrays.fill(dist, Integer.MAX_VALUE);
dist[start] = 0;
while (!pq.isEmpty()) {
int[] current = pq.poll();
int currentNode = current[0];
int currentLength = current[1];
if (currentNode == end) {
return currentLength <= limit;
}
graph.get(currentNode).forEach(edge -> {
int newLength = currentLength + edge.length;
if (newLength < dist[edge.to]) {
dist[edge.to] = newLength;
pq.offer(new int[]{edge.to, newLength});
}
});
}
return false;
}
}
解释
方法:
这道题目使用了Union-Find数据结构来解决边长度限制的路径查询问题。Union-Find通常用于处理动态连通性问题。在这个问题中,我们对边按照长度进行排序,并逐步将它们加入到一个并查集中。每个操作都会更新节点的连接关系和边界限制。这使得我们可以对于每个查询有效地判断两个节点是否可以通过一条边长限制在指定值以下的路径相连。
具体来说,初始化时,对所有边按照长度升序排序,并逐一合并节点。节点合并时,会更新根节点之间的最大边界。查询时,我们检查两个节点是否可以通过小于限制的边连接起来。
时间复杂度:
O(E log E + Eα(n) + Qα(n))
空间复杂度:
O(n + E)
代码细节讲解
🦆
在初始化并查集时,您如何处理边界数组`dists`的更新,特别是在边的长度超过查询的限制时的情况?
▷🦆
您提到使用路径压缩优化查找操作,能否详细解释如何在路径压缩过程中同时更新距离和等级信息?
▷🦆
对于`union`操作中的距离`d`如何确保它总是反映两个节点之间最短路径的正确距离?
▷🦆
在处理查询时,如何确保`find`方法能够准确地返回是否存在小于指定`limit`的路径连接两个节点?
▷