Professional Documents
Culture Documents
Shortest Path
Shortest Path
https://visualgo.net/en/sssp
array D[] nya jadi dist
minimum kalo cuma boleh
lewat at most satu edge
algonya bisa lu ulang K
kali supaya D[] itu jadi dist
minimum kalo boleh lewat
at most K edge
karena shortest path gak
bakal lewat lebih dari N-1
edge (kenapa?), lu bisa
ulang algonya N-1 kali
for (int i = 0; i < N - 1; ++i) {
for ((u, v, w) : E) {
relax(u, v, w)
}
}
kompleksitas?
O(VE)
gimana cara cek apakah
ada negative cycle (yang
reachable dari S)
loop satu iterasi relax lagi, cek apakah
relaxnya masi ada yang berubah
}
if (visited[j]) continue;
if (u == -1 || D[j] < D[u]) u = j;
relax(u, v, w);
}
visited[u] = true
}
typedef pair<int, int> pii;
pq.push(make_pair(D[S], S));
memset(visited, false, sizeof(visited);
for (int i = 0; i < N; ++i) {
int u;
while (true) {
u = pq.top().second;
pq.pop();
if (!visited[u]) break;
}
for ((v, w) : adj[u]) {
relax(u, v, w);
pq.push(make_pair(D[v], v));
}
visited[u] = true
}
O(E lg V)
kalo mau dapetin
pathnya?
tiap node simpen “parent”nya di
mana.
c[i][j][k] =
min(c[i][j][k-1],
c[i][k][k-1] + c[k][j][k-1])
karena c[i][j][k] ≥ c[i][j][k+1],
kita bisa pake hapus dimensi
terakhirnya, terus dia timpa2
gitu
// setup
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
C[i][j] = INF;
}
}
for (int i = 0; i < N; ++i) C[i][i] = 0;
for ((u, v, w) : E) C[u][v] = w;
// algo
for (int k = 0; k < N; ++k) {
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
C[i][j] = min(C[i][j], C[i][k] + C[k][j]);
}
}
}
lebih pendek lagi kalo punya
template/macro
#define REP(i, n) for (int (i)=0;(i)<(n);++(i))
#define MIN(a, b) a = min(a, b)
Negative
weight NO YES NO YES YES
Negative
cycle NO YES NO NO NO
output = -1
output = 2
output = 3
……
kalo ada exit yang lu bisa ke
exit itu lebih cepet dari any
api, maka lu bisa keluar
BFS dari lu supaya tau
shortest path ke semua point
1 ≤ V, E ≤ 100k
……
tiap edge yang weightnya w
diganti jadi pair (w, 1)
soal lagi
dikasih weighted graph, tapi sekarang tiap edge
ada warnanya, putih ato hitam.
1 ≤ V, E ≤ 100k
……
lu bisa bikin “graph baru”, satu node
itu satu “state”
1 ≤ V, E, Q ≤ 100k
……
precompute untuk setiap
node u, shortest path S~>u
(to[u]) dan u~>T (from[u])
yang precompute u~>T,
caranya balik arah semua
edge, terus run SSSP dari T
terus kalo ada query x, y, z,
shortest pathnya pake edge
ini adalah to[x] + z + from[y]