Figura 1: Figura con ciclos
Un camino en un grafo es una lista de nodos de forma que dos nodos consecutivos son adyacentes. Utilizaremos la siguiente notación: \[ v_0\mapsto v_1\mapsto\ldots v_n. \]
Un ciclo es un camino donde el vértice de inicio y el final son iguales.
Un grafo dirigido tiene ciclos si y solamente si realizando el algoritmo DFS aparecen aristas atrás.
Figura 2: Figura con ciclos
Los grafos directos acíclicos son muy utilizados, modelan:
Figura 3: Ejemplo de DAG
Figura 4: Tomada del libro Unlocked algorithms de T. Cormen (capítulo 5).
Figura 5: Grafo con pesos
El camino crítico en un grafo es el camino cuya suma de longitudes de aristas es máxima entre todos los posibles caminos.
El camino mínimo entre dos vértices u,v es cualquier con longitud mínima entre u y v.
Imagen tomada de Algorithms ( Papadimitriou, C. H. et al)
BFS(G,s):
for(int u: G.V):
distancia[u]=Double.Infinity;
distancia[s] = 0;
Q = Queue(s);
while !Q.isEmpty(){
u = Q.poll();
for((u,v): G.E){
if(distancia[v] == Double.Infinity)
{
Q.push(v);
distancia[v]=distancia[u] + 1;
}
}
}
Figura 10: Dos grafos equivalentes para BFS
El algoritmo de Dijkstra implementa el sistema de alarmas con una cola de prioridad que tiene las siguientes operaciones:
update(u,v):
if (dist[v] > dist(u) + l(u,v))
{
dist[v] = dist(u) + l(u,v);
prev[v] = u;
Decrease-key(H,v);
}
dijkstra (G, l, s):
for (v: V)
{
dist[v] = Infinity;
prev[v] = nil;
}
dist[s] = 0;
H = makequeue(s); // Hacer la cola de prioridad
while(!H.empty())
{
u = H.Delete-min();
for ((u,v): E)
{
update(u,v);
}
}
Figura 11: Grafo con pesos negativos
BellmanFord (G, l, s):
for (v: V)
{
dist[v] = Infinity;
prev[v] = nil;
}
dist[s] = 0;
for(v:V)
{
for(e:E)
{
update(e);
}
}