- UNEFA -
TEORIA DE GRAFOS
PROFESOR: ALUMNO:
ALGORITMO
Teniendo un grafo dirigido ponderado de N nodos no aislados, sea x el nodo inicial. Un vector D de
tamaño N guardará al final del algoritmo las distancias desde x hasta el resto de los nodos.
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 sería 0.
2. Sea a = x (Se toma a como nodo actual.)
3. Se recorren todos los nodos adyacentes de a, excepto los nodos marcados. Se les
llamará nodos no marcados vi.
4. Para el nodo actual, se calcula la distancia tentativa desde dicho nodo hasta sus vecinos
con la siguiente fórmula: 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 más la distancia desde dicho
nodo ‘a’ (el actual) hasta el nodo vi. Si la distancia tentativa es menor que la distancia
almacenada en el vector, se actualiza entonces el vector con esta distancia tentativa. Es
decir, si dt(vi) < Dvi→ Dvi = dt(vi)
5. Se marca como completo el nodo a.
6. Se toma como próximo nodo actual el de menor valor en D (puede hacerse almacenando
los valores en una cola de prioridad) y se regresa al paso 3, mientras existan nodos no
marcados.
Una vez terminado al algoritmo, D estará completamente lleno
PSEUDOCODIGO
Estructura de datos auxiliar: Q = Estructura de datos cola de prioridad (se puede implementar con
un montículo)
IMPLEMENTACION EN JAVA
/**
1 * Realizar el algoritmo de Dijkstra sobre el grafo
2 * @param origen nodo inicial
3 * @param destino nodo destino
4 * @return camino ArrayList con el camino a seguir.
5 */
6 public ArrayList<Integer> dijkstra(int origen, int
destino) {
7 ArrayList<Integer> camino= new
ArrayList<Integer>();
8 int distancia=Grafo.INFINITO;
9 int nodo=origen;
10 boolean fin=true;
11 camino.add(nodo);
12 while(fin) {
13 if(this.floydC[nodo][destino]<distancia) {
14 /*El metodo siguiente(nodo, destino),
nos devuelve
15 el siguiente nodo a visitar*/
16 nodo=this.siguiente(nodo, destino);
17 camino.add(nodo);
18 }
19
20 if(nodo==destino) {
21 fin=false;
22 }
23 }
24
25 return camino;
26 }
ALGORITMO DE PRIM
El algoritmo de Prim es un algoritmo perteneciente a la teoría de los grafos para encontrar
un árbol recubridor mínimo en un grafo conexo, no dirigido y cuyas aristas se están etiquetadas.
En otras palabras, el algoritmo encuentra un subconjunto de aristas que forman un árbol con todos
los vértices, donde el peso total de todas las aristas en el árbol es el mínimo posible. Si el grafo no
es conexo, entonces el algoritmo encontrará el árbol recubridor mínimo para uno de los
componentes conexos que forman dicho grafo no conexo.
El algoritmo fue diseñado en 1930 por el matemático Vojtech Jarnik y luego de manera
independiente por el científico computacional Robert C. Prim en 1957 y redescubierto
por Dijkstra en 1959. Por esta razón, el algoritmo es también conocido como algoritmo
DJP o algoritmo de Jarnik.
PSEUDOCODIGO DEL ALGORITMO
Prim (Grafo G)
/* Inicializamos todos los nodos del grafo.
La distancia la ponemos a infinito y el padre de cada nodo a
NULL
Encolamos, en una cola de prioridad
donde la prioridad es la distancia,
todas las parejas <nodo, distancia> del grafo*/
por cada u en V[G] hacer
distancia[u] = INFINITO
padre[u] = NULL
Añadir(cola,<u, distancia[u]>)
distancia[u]=0
mientras !esta_vacia(cola) hacer
// OJO: Se entiende por mayor prioridad aquel nodo cuya
distancia[u] es menor.
u = extraer_minimo(cola) //devuelve el mínimo y lo
elimina de la cola.
por cada v adyacente a 'u' hacer
si ((v ∈ cola) && (distancia[v] > peso(u, v))
entonces
padre[v] = u
distancia[v] = peso(u, v)
Actualizar(cola,<v, distancia[v]>)
ALGORITMO DE KRUSKAL
PSEUDOCODIGO
función Kruskal(G)
Para cada v en V[G] hacer
Nuevo conjunto C(v) ← {v}.
Nuevo heap Q que contiene todas las aristas de G, ordenando por
su peso.
Defino un arbol T ← Ø
// n es el número total de vértices
Mientras T tenga menos de n-1 aristas y !Q.vacío() hacer
(u,v) ← Q.sacarMin()
// previene ciclos en T. agrega (u,v) si u y v están
diferentes componentes en el conjunto.
// Nótese que C(u) devuelve la componente a la que pertenece
u.
Si C(v) ≠ C(u) hacer
Agregar arista (v,u) a T.
Merge C(v) y C(u) en el conjunto
Responder arbol T
ALGORITMO DE FLOYD-WARSHALL
En informática, el algoritmo de Floyd-Warshall, descrito en 1959 por Bernard Roy, es
un algoritmo de análisis sobre grafos para encontrar el camino mínimo en grafos dirigidos
ponderados. El algoritmo encuentra el camino entre todos los pares de vértices en una única
ejecución. El algoritmo de Floyd-Warshall es un ejemplo de programación dinámica.
Muchos problemas de la vida cotidiana se pueden expresar e incluso resolver en forma de grafo.
Existen algoritmos que encuentran distintos tipos de soluciones, tanto booleanas como de
eficiencia. El grafo se representa en una tabla (matriz) que se conoce como “matriz de adyacencia”
y representa si existe una unión entre dos nodos (boolean).
PSEUDOCODIGO
INTRODUCCION………………………………………………………………………..................................................1
ALGORITMO DE DIJKSTRA………………………………………………………..…………………………………………………….2
PSEUDOCODIGO DE DIJKSTRA………………………………………………………………………………………………….…….3
OTRA VERSION EN PSEUDOCODIGO SIN COLA DE PRIORIDAD………………………………………4,5
IMPLEMENTACION EN JAVA……………………………………………………………………………………5,6
ALGORITMO DE PRIM……………………………………………………………………………………………………….…….6
PSEUDOCODIGO DE PRIM…………………………………………………………………………………………………..………….6
ALGORITMO DE KRUSKAL……………………………………………………………………………………………………….………7
PSEUDOCODIGO DE KRUSKAL…………………………………………………………………………………………………………7
ALGORITMO DE FLOYD-WARSHALL………………………………………………………………………………………………..8
PSEUDOCODIGO DE FLOYD-WARSHALL………………………………………………………………………………………….8
CONCLUSION……………………………………………………………….…………………………………………………………………9
BIBLIOGRAFIA………………………………………………………………………………………………………………….……………10
BIBLIOGRAFIA
https://es.wikipedia.org/wiki/Algoritmo_de_Prim
https://es.wikipedia.org/wiki/Algoritmo_de_Dijkstra
https://es.wikipedia.org/wiki/Algoritmo_de_Floyd-Warshall
https://es.wikipedia.org/wiki/Algoritmo_de_Kruskal