Tossaporn Saengja

Weighted Shortest Path

visualgo

Dijkstra’s Algorithm (implementation)

https://cp-algorithms.com/graph/dijkstra.html

const int INF = 1000000000;
vector<vector<pair<int, int>>> adj;

void dijkstra(int s, vector<int> & d, vector<int> & p) {
    int n = adj.size();
    d.assign(n, INF);
    p.assign(n, -1);
    vector<bool> u(n, false);

    d[s] = 0;
    for (int i = 0; i < n; i++) {
        int v = -1;
        for (int j = 0; j < n; j++) {
            if (!u[j] && (v == -1 || d[j] < d[v]))
                v = j;
        }

        if (d[v] == INF)
            break;

        u[v] = true;
        for (auto edge : adj[v]) {
            int to = edge.first;
            int len = edge.second;

            if (d[v] + len < d[to]) {
                d[to] = d[v] + len;
                p[to] = v;
            }
        }
    }
}

Bellman-Ford

// credit from https://github.com/Autoratch/practice
#include <bits/stdc++.h>
using namespace std;

int n, m, s, e;
vector<pair<int, pair<int, int>>> adj;
vector<int> dist;

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  cin >> n >> m >> s >> e;

  adj.resize(m);
  dist.assign(n, INT_MAX);

  for (int i = 0; i < m; i++) {
    int a, b, d;
    cin >> a >> b >> d;
    adj[i] = {d, {a, b}};
  }

  dist[0] = 0;
  for (int i = 0; i < n - 1; i++)
    for (int j = 0; j < m; j++) {
      int a = adj[i].second.first, b = adj[i].second.second, d = adj[i].first;
      if (dist[a] != INT_MAX and dist[a] + d < dist[b])
        dist[b] = dist[a] + d;
    }

  cout << dist[e];
}

Floyd-Warshall (implementation)

https://cp-algorithms.com/graph/all-pair-shortest-path-floyd-warshall.html

for (int k = 0; k < n; ++k) {
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            d[i][j] = min(d[i][j], d[i][k] + d[k][j]); 
        }
    }
}

Johnson (exist)

A* Search

https://www.redblobgames.com/pathfinding/a-star/introduction.html