mirror of
https://github.com/Steffo99/appunti-magistrali.git
synced 2024-11-25 03:34:17 +00:00
1.3 KiB
1.3 KiB
Algoritmo di Kruskal
L'Algoritmo di Kruskal è un algoritmo greedy che trova il minimum spanning tree di un grafo.
Funzionamento
- Ripetiamo questa procedura finchè tutti i nodi non sono connessi:
- Prendiamo ad ogni passo l'arco meno costoso del grafo non ancora aggiunto all'insieme.
- Assicuriamoci che non si creino cicli: se non se ne verrebbero a creare, possiamo aggiungere l'arco all'insieme.
- Gli archi devono quindi connettere nodi in componenti connesse diverse.
- Possiamo rappresentare le componenti connesse con un Disjoint Set.
- Gli archi devono quindi connettere nodi in componenti connesse diverse.
Costo computazionale
Categoria | Upper bound |
---|---|
Tempo | O(archi²) |
Scomposizione
- DisjointSet.init():
O(archi)
- Per ogni ciclo:
O(archi²)
- DisjointSet.find_set():
O(1)
- DisjointSet.union():
O(archi)
- DisjointSet.find_set():
Pseudocodice
def minimum_spanning_tree_kruskal(graph):
ds = DisjointSet()
for node in graph.nodes:
ds.create_set(node)
arcs = []
sorted_arcs = sorted(graph.arcs, key=lambda arc: arc.cost)
for arc in sorted_arcs:
if ds.find_set(node.start) != ds.find_set(node.end):
arcs.append(arc)
ds.union(node.start, node.end)
return arcs