Algoritmo de Kruskal
Algoritmo de Prim
Algoritmo de Dijkstra
Algoritmo de Kruskal
El algoritmo de Kruskal es un algoritmo de la teora de grafos para encontrar
un rbol recubridor mnimo en un grafo conexo y ponderado. Es decir, busca un
subconjunto de aristas que, formando un rbol, incluyen todos los vrtices y donde
el valor total de todas las aristas del rbol es el mnimo. Si el grafo no es conexo,
entonces busca un bosque expandido mnimo (un rbol expandido mnimo para
cada componente conexa). El algoritmo de Kruskal es un ejemplo de algoritmo
voraz.
se crea un bosque B (un conjunto de rboles), donde cada vrtice del grafo
es un rbol separado
mientras C es no vaco
1. Inicializar todas las distancias en D con un valor infinito relativo ya que son
desconocidas al principio, exceptuando la de x que se debe colocar en 0
debido a que la distancia de x a x sera 0.
2. Sea a = x (tomamos a como nodo actual).
3. Recorremos todos los nodos adyacentes de a, excepto los nodos
marcados, llamaremos a estos nodos no marcados vi.
4. Para el nodo actual, calculamos la distancia tentativa desde dicho nodo a
sus vecinos con la siguiente frmula: dt(vi) = Da + d(a,vi). Es decir, la
distancia tentativa del nodo vi es la distancia que actualmente tiene el
nodo en el vector D ms la distancia desde dicho el nodo a (el actual) al
nodo vi. Si la distancia tentativa es menor que la distancia almacenada en
el vector, actualizamos el vector con esta distancia tentativa. Es decir: Si
dt(vi) < Dvi Dvi = dt(vi)
5. Marcamos como completo el nodo a.
6. Tomamos como prximo nodo actual el de menor valor en D (puede
hacerse almacenando los valores en una cola de prioridad) y volvemos al
paso 3 mientras existan nodos no marcados.
Una vez terminado al algoritmo, D estar completamente lleno.
Complejidad
Orden de complejidad del algoritmo: O(|V|2+|A|) = O(|V|2) sin utilizar cola de
prioridad, O((|A|+|V|) log |V|) = O(|A| log |V|) utilizando cola de prioridad (por
ejemplo un montculo). Por otro lado, si se utiliza un Montculo de Fibonacci,
sera O(|V| log |V|+|A|).
Podemos estimar la complejidad computacional del algoritmo de Dijkstra (en
trminos de sumas y comparaciones). El algoritmo realiza a lo ms n-1
iteraciones, ya que en cada iteracin se aade un vrtice al conjunto distinguido.
Para estimar el nmero total de operaciones basta estimar las que se llevan a
cabo en cada iteracin. Podemos identificar el vrtice con la menor etiqueta entre
los que no estn en Sk realizando n-1 comparaciones o menos. Despus hacemos
una suma y una comparacin para actualizar la etiqueta de cada uno de los
vrtices que no estn en Sk. Por tanto, en cada iteracin se realizan a lo sumo 2(n1) operaciones, ya que no puede haber ms de n-1 etiquetas por actualizar en
cada iteracin. Como no se realizan ms de n-1 iteraciones, cada una de las
cuales supone a lo ms 2(n-1) operaciones, llegamos al siguiente teorema.
TEOREMA: El Algoritmo de Dijkstra realiza O(n2) operaciones (sumas y
comparaciones) para determinar la longitud del camino ms corto entre dos
vrtices de un grafo ponderado simple, conexo y no dirigido con n vrtices.