最短路径算法

Floyed-Warshall

采用 dp 的思想。设 \(dp_{(i,j)}\) 表示 \(i\)\(j\) 的最短路径,那么对于任意的 \(k\)\(dp_{(i,j)}=\min(dp_{(i,j)}, dp_{(i,k)} + dp_{(k,j)})\)

void floyed() {
  for (int k = 1; k <= n; k++) {
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
      }
    }
  }
}

Dijkstra

采用贪心的思想,求一个点到其他点的最短路。每一步都从最短的路经走到其他地方,一般使用 \verb|priority_queue| 进行取最小值。此算法不能处理负边权的情况。

void dijkstra(int s) {
  priority_queue<Edge> q;
  fill(d + 1, d + n + 1, 1e9);
  fill(f + 1, f + n + 1, 0);
  for (q.push({s, 0}), d[0] = 0; q.size(); ) {
    Edge t = q.top();
    q.pop();
    if (f[t.to]) {
      continue;
    }
    f[t.to] = 1;
    for (auto i : e[t.to]) {
      if (d[t.to] + i.v < d[i.to]) {
        d[i.to] = d[t.to] + i.v;
        q.push({i.to, d[i.to]});
      }
    }
  }
}

Sortest Path Faster Algorithm

关于 SPFA,她死了。
posted @ 2023-10-15 15:28  haokee  阅读(23)  评论(0)    收藏  举报