image.png

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

cynthia
1 声望0 粉丝