Beruflich Dokumente
Kultur Dokumente
GRAFOS (parte 1)
2 Introduccin
Los grafos sirven
para representar
relaciones
arbitrarias (no
necesariamente
jerrquicas)
entre objetos de
1
Grafos datos
M.C. Yal Galicia Hdez. (FCC/BUAP) M.C. Yal Galicia Hdez. (FCC/BUAP)
5 Definiciones 6 Definiciones
Un grafo no dirigido es aquel que los arcos
Un grafo consiste en un conjunto de vrtices o estn formados por pares de nodos no
nodos (V) y un conjunto de arcos o aristas (A).
ordenados, se representa u v.
Un grafo se representa con el par G = (V,A).
Si (u,v) es una arista en el conjunto de aristas
El nmero de elementos de V se llama orden del grafo A(G), entonces u y v se dice que
del grafo son vrtices adyacentes.
Un grafo nulo es un grafo de orden cero Es decir, dos vrtices son adyacentes si hay un
Un arco o arista est formado por un par de arco que los une.
nodos u y v, y se representa por (u,v) Un arco tiene, a veces, asociado un factor
Un grafo es dirigido (o digrafo) si los pares de de peso, en cuyo caso se dice que es un
nodos que forman los arcos son ordenados y se grafo valorado o ponderado.
representan u v.
M.C. Yal Galicia Hdez. (FCC/BUAP) M.C. Yal Galicia Hdez. (FCC/BUAP)
9 Fundamentos 10 Fundamentos
Grafos conexos Grafos Completos
Un grafo no dirigido es conexo si existe un camino entre Un grafo completo es aquel en que cada vrtice est
cualquier par de nodos que forman el grafo conectado con todos y cada uno de los restantes
nodos.
Ejemplos:
Si existen n vrtices, habr (n-1) aristas en un grafo
completo y dirigido, y n(n-1)/2 aristas en un grafo no
dirigido completo.
grafo no conexo con dos
grafo conexo Ejemplos:
componentes conexas
Grafos fuertemente conexos
Un grafo dirigido es fuertemente conexo si existe
un camino entre cualquier par de nodos que
forman el grafo
Ejemplos: Grafo completo no dirigido
M.C. Yal Galicia Hdez. (FCC/BUAP)
Grafo completo dirigido
M.C. Yal Galicia Hdez. (FCC/BUAP)
M.C. Yal Galicia Hdez. (FCC/BUAP) M.C. Yal Galicia Hdez. (FCC/BUAP)
Actividad Individual
19 Representacin: matriz de 20
Grafo
-M[][]: int ListaLigada
Actividad
21 individual -vertices:
22 ListaLigada -inicio: Nodo
+Grafo() +ListaLigada()
+Grafo(n: int)
Deducir la matriz de adyacencia para el +insertar(v: Vertice): boolean
+agregarVertice(v: String): boolean +eliminar(v: Vertice): boolean
siguiente grafo con aristas ponderadas. +eliminarVertice(v: String) ): +eliminar(index: int): boolean
boolean +mostrar(): void
+agregarArista(vo: String, vd: String)
8 3 +eliminarArista(vo: String, vd: String)
1 2 +mostrarMatriz(): void
15 7 34 11 +mostrarVertices(): void
5
+getOrden(): int
12 98 Vertice
10 6 +getGrado(vertice: String): int
4 5 -nombre: String
8 -index: int
15 74
20 2 Nodo +Vertice(nombre: string)
7 +Vertice(nombre: string, index)
vertice: Vertice
7 9 sgte: Nodo +getIndex(nombre: string): int
8 +getNombre(): String
+Nodo()
M.C. Yal Galicia Hdez. (FCC/BUAP) +Nodo(v: M.C.
vertice)
Yal Galicia Hdez. (FCC/BUAP)
Actividad individual
27 28 Que hemos aprendido?
Obtener la lista de adyacencia para el siguiente
grafo con aristas ponderadas.
8 2
1
15 7 12
5
4 6
5
15
7
20
2
7
8
M.C. Yal Galicia Hdez. (FCC/BUAP) M.C. Yal Galicia Hdez. (FCC/BUAP)
30 Recorridos en Grafos
Muchas de las aplicaciones computacionales
naturalmente incluyen no solo un conjunto de
elementos sino un conjunto de conexiones
recorridos en grafos
Hay alguna manera de ir de un elemento a otro
siguiendo las conexiones?
29 Cuntos otros elementos pueden ser alcanzados
Profundidad y anchura desde un elemento dado?
Cual es la mejor manera de ir desde un
elemento a otro?
M.C. Yal Galicia Hdez. (FCC/BUAP) M.C. Yal Galicia Hdez. (FCC/BUAP)
M.C. Yal Galicia Hdez. (FCC/BUAP) M.C. Yal Galicia Hdez. (FCC/BUAP)
Recorrido primero en
33 Recorridos
profundidad
2
Primero en profundidad (DFS: Depth First 6 3
1 3
Search) 10
1 7
Visitar vrtice inicial vi 10 4
Visitar vrtice adyacente a vi
4
... proceder as hasta encontrar uno ya visitado... 11 12 11
9 13
13
Volver atrs hasta llegar a un vrtice con 8
adyacentes sin visitar 5
El recorrido termina cuando volviendo atrs 2 8
5
7
llegamos al vrtice inicial vi y no quedan 6 12
adyacentes por recorrer 9
Actividad Individual
Recorrido primero en
profundidad Obtener la matriz de adyacencia y el recorrido DFS del
siguiente grafo. Inicia en el nodo a
1 2 3 4 5 6 7 8 9 10 11 12 13
1
1 0 1 1 1 0 0 0 0 0 0 0 0 0 2
2 1 0 0 1 1 0 0 0 0 0 0 0 0 4
3 1 0 0 1 0 1 1 0 0 0 0 0 0 a h
4 1 1 1 0 0 1 1 1 0 0 0 0 0
3
5 0 1 0 0 0 0 0 1 1 0 0 0 0 6 i
6 0 0 1 1 0 0 0 0 0 1 0 0 0 10 g
7 0 0 1 1 0 0 0 0 0 1 0 0 0 7 b
8 0 0 0 1 1 0 0 0 0 0 1 0 0 11
9 0 0 0 0 1 0 0 0 0 0 1 1 0
10 0 0 0 0 0 1 1 0 0 0 1 0 1
8 c
5 d f
11 0 0 0 0 0 0 0 1 1 1 0 0 1
12 0 0 0 0 0 0 0 0 1 0 0 0 1 9 j
13 0 0 0 0 0 0 0 0 0 1 1 1 0 12 e
13
M.C. Yal Galicia Hdez. (FCC/BUAP)
35
M.C. Yal Galicia Hdez. (FCC/BUAP) M.C. Yal Galicia Hdez. (FCC/BUAP)
Actividad colaborativa
En binas obtener la matriz de adyacencia y el
44 Actividad colaborativa
recorrido del grafo en anchura
En equipos de 4, suponiendo que se cuenta con la
clase Grafo como se muestra.
Implementar los recorridos en profundidad y
anchura
a h
Vertice
Grafo
i -nombre: String
g -M[][]: int -index: int
b -V[]: vertice -visitado: boolean
+Grafo()
+Grafo(n: int) +Vertice(nombre: string)
c d f +agregarVertice(v: String) +Vertice(nombre: string,
+agregarArista(vo: String, vd: index)
String) +getIndex(nombre: string): int
j +verMatriz() +setVisitado(s: boolean)
e +BFS(vi: String) //anchura
M.C. Yal Galicia Hdez. (FCC/BUAP)
+isVisitado(): boolean
+DFS(vi: String) //profundidad