Académique Documents
Professionnel Documents
Culture Documents
Bloque : FC-PREEDS05C1N
Tema : GRAFOS
Alumnos
2017 - 01
INTRODUCCIÓN
Los grafos son una estructura de datos no lineal y que tiene gran número de
aplicaciones. El estudio del análisis de grafos ha interesado a los matemáticos durante siglos
y representa una parte importante de la teoría combinatoria en matemáticas. Aunque la
teoría de grafos es compleja y amplia, en esta sesión se realizará una introducción a la
teoría de grafos.
2. ¿Qué son grafos?
Los grafos permiten estudiar las interrelaciones entre unidades que se encuentran
en interacción.
VÉRTICES:
Son los puntos o nodos con los que está conformado un grafo.
Grafo dirigido:
Grafo no dirigido:
CARACTERIZACIÓN DE GRAFOS:
Grafos Simples:
Un grafo es simple si a lo más sólo 1 arista une dos vértices cualesquiera. Esto es
equivalente a decir que una arista cualquiera es el único que une dos vértices específicos.
Grafos Conexos
Un grafo es conexo si cada par de vértices está conectado por un camino; es decir, si
para cualquier par de vértices (a, b), existe al menos un camino posible desde a hacia b.
Un grafo es fuertemente conexo si cada par de vértices está conectado por al menos
dos caminos disjuntos; es decir, es conexo y no existe un vértice tal que al sacarlo el grafo
resultante sea disconexo.
Grafos completos:
Un grafo simple es completo si existen aristas uniendo todos los pares posibles de
vértices. Es decir, todo par de vértices (a, b) debe tener una arista e que los une.
Grafos bipartidos
Grafos ponderados:
Se utiliza una matriz de tamaño n × n donde las filas y las columnas hacen referencia
a los vértices para almacenar en cada casilla la longitud entre cada par de vértices del grafo.
La celda MA[i, j] almacena la longitud entre el vértice i y el vértice j. Si su valor es infinito
significa que no existe arista entre esos vértices, y MA[i, i] = 0.
2. Lista Adyacente (LA):
Se utiliza un vector de tamaño n (un elemento por cada vértice) donde LA[i] almacena
la referencia a una lista de los vértices adyacentes a i. En una red está lista almacenará
también la longitud de la arista que va desde i al vértice adyacente.
RECORRIDO DE GRAFOS
Recorrido (o búsqueda) en amplitud o anchura: (breadth-first search): Se visita a
todos los vecinos directos del nodo inicial, luego a los vecinos de los vecinos.
3. Aplicaciones reales
- Un ejemplo seria en las redes sociales. En una red social virtual como Facebook o
Twitter estas relaciones son muy claramente representadas por medio de los
“amigos o seguidores” siendo cada individuo un nodo y las relaciones sociales
virtuales que los une las aristas.
def __init__(self):
self.nodes = set()
self.edges = defaultdict(list)
self.distances = {}
Pseudocódigo
DFS(grafo G)
PARA CADA vértice u ∈ V[G] HACER
estado[u] ← NO_VISITADO
padre[u] ← NULO
tiempo ← 0
PARA CADA vértice u ∈ V[G] HACER
SI estado[u] = NO_VISITADO ENTONCES
DFS_Visitar(u,tiempo)
DFS_Visitar(nodo u, int tiempo)
estado[u] ← VISITADO
tiempo ← tiempo + 1
d[u] ← tiempo
PARA CADA v ∈ Vecinos[u] HACER
SI estado[v] = NO_VISITADO ENTONCES
padre[v] ← u
DFS_Visitar(v,tiempo)
estado[u] ← TERMINADO
tiempo ← tiempo + 1
f[u] ← tiempo
1 método BFS(Grafo,origen):
2 creamos una cola Q
3 agregamos origen a la cola Q
4 marcamos origen como visitado
5 mientras Q no este vacío:
6 sacamos un elemento de la cola Q llamado v
7 para cada vértice w adyacente a v en el Grafo:
8 si w no ha sido visitado:
9 marcamos como visitado w
10 insertamos w dentro de la cola Q
4.3 Algoritmo para hallar la ruta más corta (shortest path)
El modelo de Ruta más corta consiste en una red donde cada arco (i,j), posee un cij,
que representa la distancia (diferente de cero) que existe del nodo i al nodo j.(Eppen, 2000).
En resumen el Problema de la Ruta más corta está dado entre un punto origen y un punto
destino (Taha, 2012) (Nagih Soumis, 2005).
1 método Dijkstra(Grafo,origen):
2 creamos una cola de prioridad Q
3 agregamos origen a la cola de prioridad Q
4 mientras Q no esté vacío:
5 sacamos un elemento de la cola Q llamado u
6 si u ya fue visitado continuó sacando elementos de Q
7 marcamos como visitado u
8 para cada vértice v adyacente a u en el Grafo:
9 sea w el peso entre vértices ( u , v )
10 si v no ha sido visitado:
11 Relación( u , v , w )
5 Código en Python
Búsqueda en profundidad
def profundidad(self,eleccion):
visitados=[]
pila=[]
imprimir=[]
pila.append(eleccion)
visitados.append(eleccion)
if eleccion in self.grafo:
while pila:
x = pila[-1]
print "Pila:",pila
imprimir.append(x)
pila.remove(pila[-1])
for key,nada in self.grafo[x]:
if key not in visitados:
visitados.append(key)
pila.append(key)
print "=========Resultados========="
print "Visitados:",visitados
print "Imprimir:",imprimir
print "Pila:",pila
os.system("pause")
else:
print "No existe"
os.system("pause")
Búsqueda en anchura
def anchura(self,eleccion):
visitados=[]
cola=[]
imprimir=[]
cola.append(eleccion)
visitados.append(eleccion)
if eleccion in self.grafo:
while cola:
x = cola[0]
print "Cola:",cola
imprimir.append(x)
cola.pop(0)
visitados.append(key)
cola.append(key)
print "=========Resultados========="
print "Visitados:",visitados
print "Imprimir:",imprimir
print "Cola:",cola
os.system("pause")
else:
os.system("pause")
full_path.appendleft(origin)
full_path.append(destination)
Conclusiones
Bibliografía
❖ Trudeau, Richard J. (1993). Dover Pub., ed. Introduction to Graph Theory (Edición
corregida y aumentada.).
❖ Grafos https://www.uam.es/personal_pdi/ciencias/gallardo/capitulo8a.pdf