1
Fork 0
mirror of https://github.com/Steffo99/unisteffo.git synced 2024-11-22 16:04:21 +00:00
triennale-appunti-steffo/public/materials/year1/algoritmi/29_AlgoritmoDiKruskal.md

1.3 KiB

Algoritmo di Kruskal

L'Algoritmo di Kruskal è un algoritmo greedy che trova il minimum spanning tree di un grafo.

Funzionamento

  1. Ripetiamo questa procedura finchè tutti i nodi non sono connessi:
    1. Prendiamo ad ogni passo l'arco meno costoso del grafo non ancora aggiunto all'insieme.
    2. 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.

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)

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