JS最短路径算法
在计算机科学中,最短路径算法是一类用于计算图中两个顶点之间的最短路径的算法。这些算法在许多应用领域都有广泛的应用,比如路线规划、网络通信和数据分析等。本文将介绍几种常见的JS最短路径算法,包括Dijkstra算法、贝尔曼-福特算法和Floyd-Warshall算法。
Dijkstra算法
Dijkstra算法是一种用于计算有向图中单源最短路径的贪心算法。它通过不断选择当前距离源点最近的顶点,并更新其他顶点到源点的距离来求解最短路径。
算法步骤
1.创建一个距离数组dist[],用于存储每个顶点到源点的距离。初始时,将所有顶点的距离设置为无穷大,将源点的距离设置为0。
2.创建一个集合visited[],用于记录已经到最短路径的顶点。
3.重复以下步骤直到集合visited[]包含所有顶点:
–从未访问过的顶点中选择一个距离源点最近的顶点u。
–将u标记为visited[]。
–更新所有与u相邻的顶点v的距离,如果通过u到达v的距离比当前记录的距离小,则更新距离数组dist[]。
4.返回距离数组dist[]。
实现代码
function dijkstra(graph, source) {
const dist = new Array(graph.length).fill(Infinity);
dist[source] = 0;
const visited = new Set();
while (visited.size < graph.length) {
let u = -1;
for (let i = 0; i < graph.length; i++) {
if (!visited.has(i) && (u === -1 || dist[i] < dist[u])) {
u = i;
}
}
visited.add(u);
for (let v = 0; v < graph.length; v++) {
if (!visited.has(v) && graph[u][v] !== Infinity) {
const alt = dist[u] + graph[u][v];
if (alt < dist[v]) {
dist[v] = alt;
}
}
}
}
return dist;
}
贝尔曼-福特算法
贝尔曼-福特算法是一种用于计算有向图中单源最短路径的动态规划算法。相比于Dijkstra算法,贝尔曼-福特算法能够处理带有负权边的图。
算法步骤
5.创建一个距离数组dist[],用于存储每个顶点到源点的最短路径长度。初始时,将所有顶点的距离设置为无穷大,将源点的距离设置为0。
6.重复以下步骤V-1次(V为图中顶点的数量):
–遍历图中的每条边(u, v),如果通过u到达v的距离dist[u]加上边(u, v)的权重w小于当前记录的距离dist[v],则更新距离数组dist[v]。
7.检查图中是否存在负权回路,如果存在,则无法到最短路径;否则返回距离数组dist[]。
实现代码
function bellmanFord(graph, source) {
const dist = new Array(graph.length).fill(Infinity);
dist[source] = 0;
for (let i = 0; i < graph.length - 1; i++) {
for (let u = 0; u < graph.length; u++) {
for (let v = 0; v < graph.length; v++) {
if (graph[u][v] !== Infinity) {
const alt = dist[u] + graph[u][v];
if (alt < dist[v]) {
dist[v] = alt;
}
}
}
}
}
for (let u = 0; u < graph.length; u++) {
for (let v = 0; v < graph.length; v++) {
if (graph[u][v] !== Infinity) {
const alt = dist[u] + graph[u][v];
if (alt < dist[v]) {
throw new Error("Graph contains negative-weight cycle");
}
}
js 二维数组 }
}
return dist;
}
Floyd-Warshall算法
Floyd-Warshall算法是一种用于计算有向图中所有顶点对之间最短路径的动态规划算法。它通过逐步计算每对顶点之间的最短路径长度来求解最短路径。
算法步骤
8.创建一个二维数组dist[],用于存储每对顶点之间的最短路径长度。初始时,将所有顶点对之间的距离设置为无穷大。
9.对于每条边(u, v),将dist[u][v]设置为边(u, v)的权重。
10.重复以下步骤V次(V为图中顶点的数量):
–遍历图中的每个顶点k,如果通过顶点k可以使得从顶点u到达顶点v的距离dist[u][v]变小,则更新距离数组dist[u][v]。
11.返回距离数组dist[]。
实现代码
function floydWarshall(graph) {
const dist = [...graph];
for (let k = 0; k < graph.length; k++) {
for (let i = 0; i < graph.length; i++) {
for (let j = 0; j < graph.length; j++) {
if (dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
return dist;
}
总结
本文介绍了几种常见的JS最短路径算法,包括Dijkstra算法、贝尔曼-福特算法和Floyd-Warshall算法。这些算法在计算图中的最短路径时具有不同的特点和适用范围。通过学习这些算法,我们可以更好地理解图论和动态规划的基本原理,并能够应用它们解决实际问题。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论