Documentos de Académico
Documentos de Profesional
Documentos de Cultura
GUIA DE PRÁCTICA 10
ASIGNATURA Estructura de Información
TEMA Grafos
PROFESOR Carlos A. Ruiz De La Cruz Melo
ALUMNO
CODIGO
FECHA
CICLO
TURNO
SEMESTRE 2013-III
1. OBJETIVOS
Que el estudiante:
2. INTRODUCCION TEORICA
Los grafos constituyen una herramienta que nos da la posibilidad de modelar relaciones en las
que hay objetos con posibilidades de comunicación, ofreciéndonos una solución menos costosa
que las presentadas por otros medios como la programación lineal.
2.1. Definición
Un grafo puede verse como un conjunto de vértices o nodos y aristas o también denominados
arcos. Cada arco es una línea que enlaza dos vértices del grafo o también dirigirse o enlazarse
a si mismo. En este ámbito los vértices son objetos que guardan información y los arcos son la
conexión existente entre los vértices. Los grafos pueden representarse de la siguiente manera:
Grafo no dirigido
nodos o vértices : A, B, C, D, E
A
Arcos o
aristas B E
C D
Grafo dirigido
A
nodos : A, B, C, D, E
Arcos o B E
aristas
C D
Un grafo dirigido G es también llamado un dígrafo en el cual cada arco e de G tiene ya una
dirección. En este grafo cada arista e esta descrita por un par ordenado (u,v), donde u y v son
nodos del grafo G
Como G es un grafo en el que cada arista e=(u,v), podemos definir G también como el par
(V,A) donde V y A tienen el siguiente significado:
Con respecto al arco a=(u,v) donde a es un arco que comienza en u y finaliza en v, se define
G como una relación que se expresa de la siguiente forma:
A V={ A, B, C, D, E}
A={ (A,B),(A,E), (B,C), (B,D)}
B E
C D
2.2.2. Grafo no dirigido
Un grafo no dirigido G tiene una definición similar a la de un grafo dirigido tal es asi que
G=(V,A) y esta definido como el par (V, A) donde:
Pero con la diferencia que al expresar la relación no hacemos mención que hay un sentido
entre un vértice y otro, simplemente es un arco entre dos vértices:
E B F
C D
2.3. Terminología
Camino: se define un camino entre dos nodos como una secuencia de nodos o vértices en
la que dos nodos contiguos o sucesivos están unidos por un arco del grafo
Camino simple: por camino simple se tiene a un camino en el que desde un vértice a
otro, en su secuencia de nodos, ningún nodo se repite, ósea no se pasa dos o mas veces
por un mismo nodo.
E B F
C D
Ciclo: por ciclo se entiende a un camino en el cual el camino simple tiene como inicio y
final de camino al mismo vértice. Cuando en un grafo no existen ciclos estamos entonces
ante un árbol.
Árbol Grafo
ciclo
A
B F A
B F
E C
E C D
Longitud de camino: es el número de nodos que tiene la secuencia de un camino
E F
C D
Grafo fuertemente conexo: se le dice al grafo en el cual para todo par de vértices se da
un camino entre ellos y a su vez un camino en sentido inverso. A continuación puede
observar dos grafos fuertemente conexos.
E A F
E A F
Grafo unilateralmente conexo: se le dice al grafo que presenta el caso contrario al que
presenta un grafo fuertemente conexo.
D A
E F
E A F
C D
Al igual que otros TAD’s, un grafo se puede implementar de varias maneras, así podemos tener
una implementación a través del uso de arreglos bidimensionales y la otra forma es haciendo
uso de listas enlazadas. ¿Cual forma es la mas adecuada para la implementación de un grafo?,
bueno, la respuesta dependerá principalmente del propósito o de la frecuencia con la que se
acceda a la información de la estructura.
Ambas estructuras, arreglos y listas tienen ventajas y desventajas las cuales pueden
consultarse en sus respectivos capítulos. En cada caso lo que se busca es la forma de
representar un grafo, para ello, un grafo se puede representar en memoria a través de una
matriz de adyacencia que es una matriz cuadrada que se utiliza como una manera de expresar
relaciones binarias, o también puede representarse a través de una lista de adyacencia en caso
la implementación fuera en termino de listas.
Matriz de adyacencia
C
ABCDA1B11C1D1
A B D
raíz
nulo
A B
nulo
nulo
B A D
Lista de adyacencia nulo
nulo
nulo
C B
nulo
nulo
D C
nulo
nulo
Sea G un grafo dirigido de n vértices y ordenados desde v1, v2, v3 hasta vn, para el cual
tenemos la matriz de adyacencia A=( I , J) del grafo G, matriz de m x m y definida de la
manera siguiente:
Una matriz A que guarda valores de 0 y 1 se conoce como matriz de bits o también matriz
booleana y depende de la clasificación de los nodos de G ya que distintas clasificaciones
pueden resultar en distintas matrices de adyacencia. Por ejemplo observemos el siguiente
grafo:
A
B C
V={ A, B, C, D }
A={ (A,D), (A,C), (C,D), (D,B), (B,A), (C,C) }
0011100000110100
A=
ORIGEN DESTINO
A D
A C
C D
D B
B A
C C
En general:
B C
V={A, B, C, D}
A={ (A,C) , (C,A), (C,D), (D,B), (B,A) }
ABCDA0010B1000C1001D0100
A=
ORIGEN DESTINO
A C
B A
C A
C D
D B
ABCDA1001B0010C0110D1000
A2 =
ORIGEN DESTINO
A A
A D
B C
C B
C C
D A
ABCDA0110B1001C2001D0010
A3=
En la matriz observamos que un 1 representa un camino de longitud 3. Sin embargo de C a
A hay dos caminos de longitud 3.
ORIGEN DESTINO
A B
A C
B A
B D
C A
C D
D C
ABCDA2001B0110C0120D1001
A4=
ORIGEN DESTINO
A A
A D
B B
B C
C B
C C
D A
D D
Como A es nuestra matriz de adyacencia, definamos ahora la matriz B como la suma total de
matrices como sigue:
B = A + A2 + A3 +....+Am
Como resultado dada la entrada i, j de la matriz B, nos dará el número total de caminos de
longitud n o menor, del vértice o nodo i al j.
Dado G un grafo dirigido simple con m vértices v1, v2…..vm. Su matriz de caminos es la matriz
cuadrada mxm donde C= v(i, j) y que se define como se muestra:
1 si hay un camino de vi a vj
Ci j =
0 si no existe camino de vi a vj
0 en caso contrario.
Considere el grafo G anterior con 4 vértices
B C
3 1 2 2
2 1 2 1
B= 3 2 3 2
2 1 1 1
reemplazando las entradas no nulas por 1, obtenemos la matriz de caminos C del grafo G:
111111111111111
1
C=
Otra manera de encontrar la matriz de caminos sin tener que hacer los cálculos anteriores es
usando el algoritmo de Warshall.
Dado un grafo G dirigido con m vértices, v 1, v2,…vm . Queremos encontrar la matriz de caminos
C para el grafo G. Para tal propósito primero se definen las matrices cuadradas mxm como
sigue:
A = C0 , C1 , C2 , …….. Cm
Cn = A
Warshall se percato que Ck (i, j) = 1 solo se puede dar si ocurre uno de los siguientes casos:
Ck-1 (i, j) = 1
De tal modo los valores de la matriz Ck se pueden obtener por la siguiente afirmación:
Especificacion GRAFO
variable
C : arreglo matricial lógico
m : entero
métodos
GRAFO() :no retorna valor.
ingresarMatrizDeAdyacencia() :no retorna valor.
matrizDeCaminos() :no retorna valor.
mostrarMatrizCamino() :no retorna valor.
menú() :no retorna valor.
significado
GRAFO se asigna memoria al arreglo dinámico.
ingresarMatrizDeAdyacencia se ingresan valores 1 y 0.
matrizDeCaminos se genera la matriz de camino(C).
mostrarMatrizCamino visualiza la matriz de camino(C).
menú se visualizan las alternativas del menú.
Fin_especificacion
Procedimiento matrizDeCaminos()
entero : k, i, j
Desde k 0 Hasta k< m con incremento 1 Hacer
Desde i 0 Hasta i< m con incremento 1 Hacer
Desde j 0 Hasta j< m con incremento 1 Hacer
C[i][j]C[i][j] (C[i][k] ^ C[k][j])
Fin_desde
Fin_desde
Fin_desde
Fin_procedimiento
Implementación del TAD en C++
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
class GRAFO{
bool **C;
int m;
public:
void menu(){
cout<< "\nMENU DE OPCIONES\n";
cout<< "----------------\n" ;
cout<<"<1> Ingresar Matriz de Adyacencia\n";
cout<<"<2> Mostrar Matriz de Camino\n";
cout<<"<3> Salir \n";
}
GRAFO(int n){
m=n;
C = new bool*[n]; //vector filas
for (int i=0;i<n;i++)
C[i] = new bool[n];
}
void ingreseMatrizDeAdyacencia(){
for(int i=0; i<m; i++){
cout<<"\n fila "<<i<<"\n";
for(int j=0; j<m; j++){
cout<<" j="<<j<<": "; cin>>C[i][j];
}
}
matrizDeCaminos();
}
void matrizDeCaminos(){
int k,i,j;
for(k=0;k<m;k++)
for(i=0;i<m;i++)
for(j=0;j<m;j++)
C[i][j]=C[i][j] | (C[i][k] & C[k][j]) ;
cout<<"\n SE HA GENERADO MATRIZ DE CAMINO";
}
void mostrarMatrizCamino(){
int i,j;
cout << "\n\nMATRIZ DE CAMINOS \n\n";
for(i=0;i<m;i++)
{
cout << "\n";
for(j=0;j<m;j++)
cout << "\t"<<C[i][j];
}
}
};
int main(){
char opcion;
int x;
GRAFO g(4);
do
{
g.menu();
cout<<"\ningrese opcion : ";
opcion=cin.get();
switch(opcion){
case '1':
g.ingreseMatrizDeAdyacencia();
break;
case '2':
g.mostrarMatrizCamino();
break;
}
cin.ignore();
}
while( opcion !='3');
system(“pause”);
return 0;
}
Probemos el programa con el grafo que se muestra a continuación:
B C
V = { A, B, C, D}
A = { (A, D) , (D, B), (B, A), (C,D)}
A B C D
A 0 0 0 1
B 1 0 0 0
A =
C 0 0 0 1
D 0 1 0 0
MENU DE OPCIONES
----------------
<1> Ingresar Matriz de Adyacencia
<2> Mostrar Matriz de Camino
<3> Salir
ingrese opcion : 1
fila 0
j=0: 0
j=1: 0
j=2: 0
j=3: 1
fila 1
j=0: 1
j=1: 0
j=2: 0
j=3: 0
fila 2
j=0: 0
j=1: 0
j=2: 0
j=3: 1
fila 3
j=0: 0
j=1: 1
j=2: 0
j=3: 0
Una vez ingresada la matriz de adyacencia se genera la matriz de caminos que se puede
visualizar con la opción 2 como se observa a continuación:
MENU DE OPCIONES
----------------
<1> Ingresar Matriz de Adyacencia
<2> Mostrar Matriz de Camino
<3> Salir
ingrese opcion : 2
MATRIZ DE CAMINOS
1 1 0 1
1 1 0 1
1 1 0 1
1 1 0 1
MATRIZ DE CAMINO
0 1 0 1 1 1 0
0 1 1 0 0 1 0
0 1 2 0 0 1 0
0 1 3 1 0 1 1
0 2 0 0 0 0 0
0 2 1 0 0 0 0
0 2 2 0 0 0 0
0 2 3 1 1 0 1
0 3 0 0 0 0 0
0 3 1 1 1 0 0
0 3 2 0 0 0 0
0 3 3 0 0 0 1
ABCDA0001B1001C0001D0100
A1 =
1 1 0 1 1 0 1
1 1 1 0 0 0 0
1 1 2 0 0 0 0
1 1 3 1 1 0 1
1 2 0 0 0 0 1
1 2 1 0 0 0 0
1 2 2 0 0 0 0
1 2 3 1 1 0 1
1 3 0 1 0 1 1
1 3 1 1 1 1 0
1 3 2 0 0 1 0
1 3 3 1 0 1 1
ABCDA0001B1001C0001D1101
A2 =
2 1 0 1 1 0 0
2 1 1 0 0 0 0
2 1 2 0 0 0 0
2 1 3 1 1 0 1
2 2 0 0 0 0 0
2 2 1 0 0 0 0
2 2 2 0 0 0 0
2 2 3 1 1 0 1
2 3 0 1 1 0 0
2 3 1 1 1 0 0
2 3 2 0 0 0 0
2 3 3 1 1 0 1
ABCDA0001B1001C0001D1101
A3 =
3 1 0 1 1 1 1
3 1 1 1 0 1 1
3 1 2 0 0 1 0
3 1 3 1 1 1 1
3 2 0 1 0 1 1
3 2 1 1 0 1 1
3 2 2 0 0 1 0
3 2 3 1 1 1 1
3 3 0 1 1 1 1
3 3 1 1 1 1 1
3 3 2 0 0 1 0
3 3 3 1 1 1 1
ABCDA1101B1101C1101D1101
A4 =
Dado un grafo dirigido G con m vértices v1, v2,…vm , tal es así que G tiene pesos, en el cual
cada arco e de G tiene un valor numérico positivo w(e) denominado peso o también longitud
de la arista e. Entonces G es posible escribirla en memoria por su raíz de pesos W que se
define como se muestra seguidamente:
W ( i, j ) =
0Si no hay arista de vi a vJ
C es una matriz de caminos que nos detalla si hay o no caminos entre los vértices. Pero
nuestro objetivo en esta parte es hallar una matriz Q que nos detalle las longitudes de los
caminos entre los vértices donde cada (i, j) de Q signifique lo siguiente:
Para lo cual definimos una lista de matrices Q0, Q1,…Qm cuyas entradas estarán dadas por:
O mas precisamente:
ABCDA0001B2400C0003D0500
4 2 A
W=
B 1 C
3
5
D
0 1 0 2 2 2
0 1 1 4 4 2
0 1 2 2
0 1 3 3 2 1
0 2 0
0 2 1
0 2 2
0 2 3 3 3 1
0 3 0
0 3 1 5 5
0 3 2
0 3 3 1
ABCDA1B243C3D5
Q1 =
1 1 0 2 2 4 2
1 1 1 4 4 4 4
1 1 2 4
1 1 3 3 3 4 3
1 2 0 2
1 2 1 4
1 2 2
1 2 3 3 3 3
1 3 0 7 5 2
1 3 1 5 5 5 4
1 3 2 5
1 3 3 8 5 3
ABCDA1B243C3D758
Q2 =
2 1 0 2 2
2 1 1 4 4
2 1 2
2 1 3 3 3 3
2 2 0
2 2 1
2 2 2
2 2 3 3 3 3
2 3 0 7 7
2 3 1 5 5
2 3 2
2 3 3 8 8 3
ABCDA1B243C3D758
Q3 =
3 1 0 2 2 3 7
3 1 1 4 4 3 5
3 1 2 3
3 1 3 3 3 3 8
3 2 0 10 3 7
3 2 1 8 3 5
3 2 2 3
3 2 3 3 3 3 8
3 3 0 7 7 8 7
3 3 1 5 5 8 5
3 3 2 8
3 3 3 8 8 8 8
ABCDA861B243C1083D75
8
Q4 =
Especificacion GRAFO
variable
Q : arreglo matricial entero.
m : entero
métodos
GRAFO(n) :no retorna valor.
ingresarMatrizDePesos() :no retorna valor.
matrizDeCaminoMinimo() :no retorna valor.
mostrarMatrizCaminoMinimo() :no retorna valor.
menú() :no retorna valor.
MINIMO() :retorna entero.
significado
GRAFO se asigna memoria al arreglo dinámico.
ingresarMatrizDeAdyacencia se ingresan valores 1 y 0.
matrizDeCaminos se genera la matriz de camino(C).
mostrarMatrizCamino visualiza la matriz de camino(C).
menu se visualizan las alternativas del menú.
MINIMO retorna el mínimo valor de dos números.
Fin_especificacion
Procedimiento matrizDeCaminos()
entero : k, i, j
Desde k 0 Hasta k< m con incremento 1 Hacer
Desde i 0 Hasta i< m con incremento 1 Hacer
Desde j 0 Hasta j< m con incremento 1 Hacer
Q[i][j]MINIMO(Q[i][j], Q[i][k] + Q[k][j])
Fin_desde
Fin_desde
Fin_desde
Fin_procedimiento
El programa funciona de manera similar al anterior programa con la diferencia que la matriz de
entrada es la matriz de pesos y la salida es la matriz de camino mínimo. También hay que
decir que cada símbolo en el programa se ingresa a través de un guion(-).
2.5. Aplicación
Un grafo es un concepto matemático que tiene múltiples aplicaciones para representar diversos
tipos de relaciones que pueden corresponder a diferentes disciplinas:
Su aplicación es tan diversa que se da también en la resolución de problemas clásicos como
el problema de los siete puentes de Konigsberg, el problema del cartero chino, el problema
del viajante de comercio, etc.
Como modelo matemático su aplicación se presenta en el control de semáforos en una
intersección de calles, para el plano de una planta de un edificio, cadenas de Markov, etc
Representación de la World- Wide Web, la red mas famosa del mundo.
En todas las áreas de la ingeniería su uso es diverso, tal es así que es adecuado para
describir redes eléctricas, circuitos, contadores o sistemas de apertura, así como también
dentro del dibujo computacional.
Uno de sus usos mas conocidos es en la representación o modelamiento de trayectos como
por ejemplo el que tienen las líneas de autobuses, en el cual se busca el camino optimo
entre dos puntos o ciudades
Su uso también se da en la gestión de proyectos, tal es así que al utilizar en esta disciplina
una técnica PERT en la programación de proyectos, una red de tareas es posible describirla
gráficamente.
Su aplicación también se da en las ciencias sociales, para describir conceptos de redes
sociales, en el cual cada nodo del grafo sustituye a un actor social, verificando su
importancia en la red y permitiendo graficar un estructura social.
También es útil en biología al ser una buena forma de representar hábitats, donde un
hábitat es representado por un nodo o vértice y los caminos o senderos o migraciones de
animales los representan los arcos o aristas.
3. REQUERIMIENTOS O MATERIAL Y EQUIPO
4. PROCEDIMIENTO
5. EJERCICIOS RESUELTOS
Ejemplo 01
A C
B D
Solución:
A A2 A3 A4
0 0 1 0 0 0 1 1 01 1 1 1 1 1 1
B= 1 1 0 0 + 1 0 1 0 + 11 1 1 + 1 1 1 1
0 0 1 1 0 1 0 1 11 1 1 1 1 1 1
0 1 0 0 0 0 0 0 11 1 0 1 1 1 1
1 1 1 1
C= 1 1 1 1
1 1 1 1
1 1 1 1
Ejemplo 02
A C
B D
Solución:
A A2 A3 A4
0 0 1 0 1 0 0 0 00 1 0 1 0 0 0
B= 1 0 0 0 + 0 0 1 0 + 10 0 0 + 0 0 1 0
1 0 0 0 0 0 1 0 10 0 0 0 0 1 0
0 1 0 1 1 1 0 1 11 1 1 1 1 1 1
1 0 0 0
C= 0 0 1 0
0 0 1 0
1 1 1 1
Ejemplo 03
A C
Solución:
011
A=C0= 111
000
0 1 0 1 1 1 0
0 1 1 1 1 1 1
0 1 2 1 1 1 1
0 2 0 0 0 0 0
0 2 1 0 0 0 1
0 2 2 0 0 0 1
011
C1= 111
000
1 1 0 1 1 1 1
1 1 1 1 1 1 1
1 1 2 1 1 1 1
1 2 0 0 0 0 1
1 2 1 0 0 0 1
1 2 2 0 0 0 1
111
C2 = 111
000
2 1 0 1 1 1 0
2 1 1 1 1 1 0
2 1 2 1 1 1 0
2 2 0 0 0 0 0
2 2 1 0 0 0 0
2 2 2 0 0 0 0
111
C3 = 111 es la matriz de camino
000
Ejemplo 04
Solución: A
a) 101
A = 101 B
000 C
b) Solución:
A D
1 0 1 0
A = 1 0 1 0
0 0 0 1 B
0 1 0 0 C
Solución: C
c) D
1 0 1 0 0 A
A = 1 0 1 0 1
0 0 0 1 0
0 1 0 0 0
0 1 1 0 0 B
E
Ejercicio 05
Halle la matriz de camino mínimo para cada uno de los siguientes grafos.
a)
3 Solución:
5 A
3 2
2 Q=
B 5 1
1
C
b) Solución:
2
3 2 3 10
A C 7 2 5
7
Q= 7
B 2 7
5 D
c)
1 Solución:
2 2 C
D
A 2 9 2 3 11
5 8 6 3 4 2
3 6
8 Q= 15 7 10 1 9
7 14 6 9 10 8
B 12 4 5 6 6
2
E
4
C
2. Halle la matriz de camino para el siguiente grafo sin usar Warshall.
B D
C
3. Halle la matriz de camino para el siguiente grafo sin usar Warshall.
A
B
D
C
E
4. Halle la matriz de camino usando Warshall, para cada caso de los ejemplos 01, 02 y 03.
5. Halle la matriz de camino mínimo para cada uno de los siguientes grafos.
a) b) 4
A 1 1
2 4 3 A
1
B D
2 B D
2
C 5
C
c) d) 10
1
A 1
1 1 5 A
1
B E 3
3 B 2 D
1
2 C 4 4
C E
D 1
1
F
8
a) b)
ABCDA1001B1001C0101D0000 ABCDA111B1101C0100D0001
c) d)
ABCA100B010C011 ABCA011B010C011
e) f)
ABCDEA10010B10001C01010D000 ABCDA0111B1001C0100D0111
00E01001
Ejercicio 06
a) A b)
A
B D B D
C C
c) d)
A
A
B D
B D
C
e) f)
A
A
B D
B D
C
C
a) Para el grafo a)
De B –A
De C- A
b) Para el grafo b)
De C-A
De B-D
c) Para el grafo d)
De B-D
De D-A
d) Para el grafo f)
De C- A
De C- B
B C
312221213232211
1
B=
raíz
nulo
A A2 A3 A4 B