mirror of
https://github.com/kuhyx/praca_magisterska.git
synced 2026-07-04 13:23:05 +02:00
130 lines
3.5 KiB
Markdown
130 lines
3.5 KiB
Markdown
|
|
# Shortest Path Algorithms — Pseudocode
|
|||
|
|
|
|||
|
|
## 1. Dijkstra's Algorithm
|
|||
|
|
|
|||
|
|
Finds shortest paths from a single source to all nodes.
|
|||
|
|
**Requirement:** all edge weights must be non-negative.
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
DIJKSTRA(Graph, source):
|
|||
|
|
for each node v in Graph:
|
|||
|
|
dist[v] ← ∞
|
|||
|
|
prev[v] ← NULL
|
|||
|
|
dist[source] ← 0
|
|||
|
|
|
|||
|
|
PQ ← min-priority queue ordered by dist
|
|||
|
|
PQ.insert(source, 0)
|
|||
|
|
visited ← ∅
|
|||
|
|
|
|||
|
|
while PQ is not empty:
|
|||
|
|
u ← PQ.extract_min()
|
|||
|
|
|
|||
|
|
if u ∈ visited:
|
|||
|
|
continue
|
|||
|
|
visited ← visited ∪ {u}
|
|||
|
|
|
|||
|
|
for each neighbour v of u with edge weight w:
|
|||
|
|
if dist[u] + w < dist[v]:
|
|||
|
|
dist[v] ← dist[u] + w
|
|||
|
|
prev[v] ← u
|
|||
|
|
PQ.insert(v, dist[v])
|
|||
|
|
|
|||
|
|
return dist, prev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Complexity:** O((V + E) log V) with a binary heap.
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 2. Bellman-Ford Algorithm
|
|||
|
|
|
|||
|
|
Finds shortest paths from a single source to all nodes.
|
|||
|
|
**Advantage over Dijkstra:** handles negative edge weights.
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
BELLMAN_FORD(Graph, source):
|
|||
|
|
for each node v in Graph:
|
|||
|
|
dist[v] ← ∞
|
|||
|
|
prev[v] ← NULL
|
|||
|
|
dist[source] ← 0
|
|||
|
|
|
|||
|
|
repeat |V| - 1 times: ← main relaxation loop
|
|||
|
|
for each edge (u, v, w) in Graph:
|
|||
|
|
if dist[u] + w < dist[v]:
|
|||
|
|
dist[v] ← dist[u] + w
|
|||
|
|
prev[v] ← u
|
|||
|
|
|
|||
|
|
for each edge (u, v, w) in Graph: ← negative cycle check
|
|||
|
|
if dist[u] + w < dist[v]:
|
|||
|
|
error "Graph contains a negative cycle"
|
|||
|
|
|
|||
|
|
return dist, prev
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Complexity:** O(V · E).
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 3. A* Algorithm
|
|||
|
|
|
|||
|
|
Finds the shortest path from source to a specific goal node.
|
|||
|
|
Uses a heuristic h(n) that estimates the cost from n to the goal.
|
|||
|
|
**Requirement:** h(n) must be admissible (never overestimates).
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
A_STAR(Graph, source, goal, h):
|
|||
|
|
for each node v in Graph:
|
|||
|
|
g[v] ← ∞ ← actual cost from source
|
|||
|
|
prev[v] ← NULL
|
|||
|
|
g[source] ← 0
|
|||
|
|
|
|||
|
|
PQ ← min-priority queue ordered by f(v) = g[v] + h(v)
|
|||
|
|
PQ.insert(source, g[source] + h(source))
|
|||
|
|
visited ← ∅
|
|||
|
|
|
|||
|
|
while PQ is not empty:
|
|||
|
|
u ← PQ.extract_min()
|
|||
|
|
|
|||
|
|
if u = goal:
|
|||
|
|
return reconstruct_path(prev, goal), g[goal]
|
|||
|
|
|
|||
|
|
if u ∈ visited:
|
|||
|
|
continue
|
|||
|
|
visited ← visited ∪ {u}
|
|||
|
|
|
|||
|
|
for each neighbour v of u with edge weight w:
|
|||
|
|
tentative ← g[u] + w
|
|||
|
|
if tentative < g[v]:
|
|||
|
|
g[v] ← tentative
|
|||
|
|
prev[v] ← u
|
|||
|
|
f[v] ← g[v] + h(v)
|
|||
|
|
PQ.insert(v, f[v])
|
|||
|
|
|
|||
|
|
return "no path found"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Complexity:** depends on heuristic quality; worst case O((V + E) log V), same as Dijkstra.
|
|||
|
|
|
|||
|
|
|
|||
|
|
## Path Reconstruction (used by all three)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
RECONSTRUCT_PATH(prev, target):
|
|||
|
|
path ← []
|
|||
|
|
node ← target
|
|||
|
|
while node ≠ NULL:
|
|||
|
|
path.prepend(node)
|
|||
|
|
node ← prev[node]
|
|||
|
|
return path
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
|
|||
|
|
## Quick Comparison
|
|||
|
|
|
|||
|
|
| Property | Dijkstra | Bellman-Ford | A* |
|
|||
|
|
|-----------------------|----------------|----------------|-----------------------|
|
|||
|
|
| Negative weights | ✗ | ✓ | ✗ |
|
|||
|
|
| Negative cycle detect | ✗ | ✓ | ✗ |
|
|||
|
|
| Heuristic required | no | no | yes (admissible h) |
|
|||
|
|
| Finds path to | all nodes | all nodes | single goal node |
|
|||
|
|
| Time complexity | O((V+E) log V) | O(V · E) | O((V+E) log V) best |
|
|||
|
|
| Best use case | general SSSP | negative edges | known goal + good h |
|