Mateo Sanabria Ardila
ISIS1105: Diseño y análisis de algoritmos
Un grafo G = (V,E), es una pareja ordenada en la que V es un conjunto no vacío de Vértices y E un conjunto de Aristas
Redes de computadores
Redes sociales
Circuitos
Demostración de teoremas
Recolector de basura
Resolver puzzles
...
Grafo no dirigido
Grafo dirigido
Matriz de adyacencia
Lista de adyacencia
Lista de aristas
Un camino p es secuencia de vértices tales que :
Dado un grafo G=(V,E) y dos vertices v,w se quiere saber:
Existe algún camino que conecte a v y w en el grafo G?
Cual es el camino de menor longitud que comunica a v,w en el grafo G?
Cuales son los caminos más cortos entre un v y todos los demás vértices en el grafo G?
Note que para los problemas definidos anteriormente puede ser importante almacenar el camino con menor longitud entre dos nodos de un grafo G, como se puede hacer eso?
Li(s):= conjunto de vertices alcanzables desde s usando un camino más corto de longitud i (nivel i de s)
Dado un grafo G y un vértice v BFS encuentra todos niveles del vértice v
# Adj: Lista de adjacencia
# s : int
def bfs(Adj, s):
visited = [False for v in Adj]
queue = [s]
while 0 < len(queue):
current_node = queue.pop(0)
if not visted[current_nod]:
# Usually here you do something
# with the current node
visted[current_nod] = True
for n in Adj[current_node]:
if not visited[n]:
queue.append(n)
Detección de ciclos
Componentes conectos
Clasificación de aristas (Tree,Back,Forward,Cross)
Ordenes topológicos
La estrategia de DFS consiste en buscar "más profundo" en el grafo siempre que sea posible.
Explora las aristas que salen del vértice descubierto más recientemente y que aún tiene aristas sin explorar.
Una vez exploradas todas las aristas, "retrocede" para explorar aristas que salgan del vértice desde el que se descubrió.
Este proceso continúa hasta que se descruba todos los vértices alcanzables desde el vértice de origen.
# Adj: Lista de adjacencia
# s : int
# visted = [False for v in Adj]
def dfs(Adj, s, visited):
# Usually here you do something
# with the current node
visted[s] = True
for n in Adj[s]:
if not visited[n]:
dfs(Adj,n,visited)
Un grafo no dirigido G es un árbol sii es conecto y no tiene ciclos
Algoritmo del camino más corto de Dijkstra
Algoritmo del camino más corto de Bellman-Ford
Single source shortest paths
Board Time!