const graph = {
A: { B: 1, C: 4 },
B: { A: 1, C: 2, D: 5 },
C: { A: 4, B: 2, D: 1 },
D: { B: 5, C: 1 }
};
这个graph
对象代表了一个加权无向图。在这个图中,每个键(如"A"、"B"、"C"、"D")代表一个顶点,而每个键的值则是一个对象,该对象的键是与该顶点直接相连的其他顶点,值是连接这两个顶点的边的权重。
图的解释
- 顶点:图中有四个顶点,分别是"A"、"B"、"C"和"D"。
- 边:每对顶点之间的连接称为边。例如,顶点"A"和顶点"B"之间有一条边,其权重为1。
- 权重:边的权重表示顶点之间连接的“成本”。权重可以表示距离、时间、费用等,根据具体的应用场景而定。
图的详细表示
- 顶点"A"与顶点"B"相连,权重为1,与顶点"C"相连,权重为4。
- 顶点"B"与顶点"A"相连,权重为1,与顶点"C"相连,权重为2,与顶点"D"相连,权重为5。
- 顶点"C"与顶点"A"相连,权重为4,与顶点"B"相连,权重为2,与顶点"D"相连,权重为1。
- 顶点"D"与顶点"B"相连,权重为5,与顶点"C"相连,权重为1。
图的应用
这种加权图的表示方法非常适合用于各种图论算法,例如寻找最短路径的Dijkstra算法、寻找所有顶点间最短路径的Floyd-Warshall算法,或者寻找最小生成树的Prim和Kruskal算法等。
例如,如果要用Dijkstra算法找到从顶点"A"到所有其他顶点的最短路径,这个图就提供了必要的输入信息:每个顶点及其与其他顶点的连接关系和权重。根据这个图,我们可以计算出从"A"出发到"B"、"C"和"D"的最短路径及其成本。
代码实现
class PriorityQueue {
constructor() {
this.queue = [];
}
enqueue(element, priority) {
this.queue.push({ element, priority });
this.queue.sort((a, b) => a.priority - b.priority);
}
dequeue() {
return this.queue.shift();
}
isEmpty() {
return this.queue.length === 0;
}
}
function dijkstra(graph, startVertex) {
const distances = {};
const prev = {};
const pq = new PriorityQueue();
// 初始化距离和前驱节点
for (let vertex in graph) {
distances[vertex] = Infinity;
prev[vertex] = null;
pq.enqueue(vertex, distances[vertex]);
}
distances[startVertex] = 0;
pq.enqueue(startVertex, distances[startVertex]);
while (!pq.isEmpty()) {
const { element: currentVertex } = pq.dequeue();
for (const neighbor in graph[currentVertex]) {
const newDistance = distances[currentVertex] + graph[currentVertex][neighbor];
if (newDistance < distances[neighbor]) {
distances[neighbor] = newDistance;
prev[neighbor] = currentVertex;
pq.enqueue(neighbor, distances[neighbor]);
}
}
}
return { distances, prev };
}
// Example usage:
const graph = {
A: { B: 1, C: 4 },
B: { A: 1, C: 2, D: 5 },
C: { A: 4, B: 2, D: 1 },
D: { B: 5, C: 1 }
};
const { distances, prev } = dijkstra(graph, 'A');
console.log(distances); // Distances from A to every other vertex
console.log(prev); // Shortest path tree
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。