Está en la página 1de 28

UNIVERSIDAD INCA GARCILASO DE LA VEGA

FACULTAD DE INGENIERIA DE SISTEMAS, COMPUTO Y TELECOMUNICACIONES

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:

 Tenga una correcta definición de la estructura de un grafo, así como su representación y


nomenclatura como TAD.
 Implemente grafos en código C++.

2. INTRODUCCION TEORICA

Un grafo es un concepto matemático que nos permite tener la posibilidad de manipular el


enmarañado de información que se da al tratar de representar problemas muy complejos como
en circuitos, redes o problemas de la vida real en las que se trata de hallar el camino mas
corto entre dos ciudades, en fin su ámbito de aplicación es muy general y cubre muchas áreas
diversas.

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

Figura 11.1. Grafo no dirigido


Un grafo se denomina grafo dirigido o no dirigido dependiendo si los arcos se denotan con una
flecha o no. El denotarlos con una flecha(grafo dirigido) significa que las uniones entre un
vértice y otro son unidireccionales, ósea que si tenemos un vértice A conectado por una arista
con un vértice B donde la flecha apunte de A a B, nos indica que el recorrido es en un solo
sentido de A a B, en caso contrario cuando la conexión se da a través de una línea sin ninguna
dirección significa que el recorrido puede darse en ambos sentidos(grafo no dirigido) ósea es
bidireccional. Por ejemplo el grafo anterior es un grafo no dirigido, mientras que el grafo que
esta a continuación es un grafo dirigido.

Grafo dirigido
A
nodos : A, B, C, D, E

Arcos o B E
aristas
C D

Figura 11.2. Grafo dirigido

2.2. Grafo dirigido y no dirigido

En la terminología de grafos encontramos dos tipos de grafos, dirigidos y no dirigidos según se


exprese o no el sentido de sus arcos. El capítulo grafos estará orientado al enfoque de los
grafos dirigidos, así que cuando usemos el término grafos significará que nos referimos a un
grafo dirigido y el término arco se referirá a un arco también dirigido, a menos que se diga o
se deduzca lo contrario.

2.2.1. Grafo dirigido

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:

V: denota el conjunto finito de nodos o también llamados vértices.


A: denota el conjunto finito de arcos o también llamadas aristas.

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:

G= { (u, v) / u, v  V , además existe un arco con un origen en u y un destino en v }

Por ejemplo el grafo siguiente puede expresarse como se observa a su derecha:

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:

V: es también el conjunto finito de nodos o vértices.


A: es también el conjunto finito de arcos

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:

G={ (u, v) / u, v  V, además existe un arco entre u y v }

Por ejemplo el siguiente grafo es un grafo no dirigido

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, A,B, F}: camino simple E-F


{ E, A, B, C, D, B, F} camino no simple E-F
A

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, A, F} camino de longitud 3


{E, C, A, F,D}:camino de longitud 5 A

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.

Por ejemplo no se puede llegar Por ejemplo no se puede llegar


de F, A o D a E de F a E

D A

E F
E A F

C D

2.4. Representación de grafos dirigidos

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.

Una matriz de adyacencia se conceptúa como una estructura bidimensional o tabla de


dimensiones V x V, en el que un par a[ i ][ j ] registrara un valor de uno si realmente existe
un arco que va del nodo i al nodo j, en caso contrario el valor del par a[ i ][ j ] será cero.

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

2.4.1. Matriz de adyacencia

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:

1 si existe una arco que va de vI a vJ


A I,J
0 si no existe una arista de vI a vJ

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) }

Luego asumiendo que el orden de los vértices es A, B, C y D, la matriz de adyacencia toma la


configuración siguiente:

0011100000110100
A=

En la matriz un valor de 1 indica un camino directo y un 0 representa un camino que no existe.

ORIGEN DESTINO
A D
A C
C D
D B
B A
C C

La importancia de la matriz de adyacencia radica principalmente en que es un mecanismo que


nos ayuda a definir los caminos de longitud 1 que se dan en el grafo.

En general:

A : nos muestra los caminos de longitud 1


A2 : A . A nos muestra los caminos de longitud 2
A3 : A2. A nos muestra los caminos de longitud 3
:
Ak : Ak-1. A nos muestra los caminos de longitud k

De lo dicho anteriormente, probémoslo con el siguiente grafo:


A

B C

V={A, B, C, D}
A={ (A,C) , (C,A), (C,D), (D,B), (B,A) }

 Matriz de caminos de longitud 1

ABCDA0010B1000C1001D0100

A=

En la matriz observamos que un 1 representa un camino directo

ORIGEN DESTINO
A C
B A
C A
C D
D B

 Matriz de caminos de longitud 2

ABCDA1001B0010C0110D1000

A2 =

En la matriz observamos que un 1 representa un camino de longitud 2.

ORIGEN DESTINO
A A
A D
B C
C B
C C
D A

 Matriz de caminos de longitud 3.

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

 Matriz de caminos de longitud 4.

ABCDA2001B0110C0120D1001

A4=

En la matriz observamos que un 1 representa un camino de longitud 4, sin embargo de A a


A hay dos caminos de longitud 4, así como también hay dos caminos de longitud 4 de C a C.

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.

2.4.2. Matriz de caminos

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

Desde la matriz B comenzamos a construir la matriz de caminos C de la manera siguiente:


1 si tenemos un número diferente de cero
Ci j = en la entrada i, j de la matriz B.

0 en caso contrario.
Considere el grafo G anterior con 4 vértices

B C

En el cual sumando las matrices A, A2, A3 y A4 obtenemos como resultado la matriz B:


A A2 A3 A4
001010001001010 1001001001101000 01101001200100 2001011001201
0 10 001
B= + + +

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.

2.4.2.1. 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

Sea entonces Ck (i, j) la entrada i, j de la matriz Ck, definimos:

1si tenemos un camino simple de vi a vJ que no usa


otros vértices aparte de posiblemente v1, v2, …Vk
Ck (i, j) =
0En otro caso
en otras palabras,

C0 (i, j) = 1 si hay un arco de vi a vJ


C1 (i, j) = 1 si hay un arco de vi a vJ que no usa otros vértices excepto
v1 o v0
C2 (i, j)) = 1 si hay un arco de vi a vJ que no usa otros vértices excepto
v2 o v1 o v0

Cn = A

Warshall se percato que Ck (i, j) = 1 solo se puede dar si ocurre uno de los siguientes casos:

a) Se tiene un camino simple de v i a vJ que no requiere usar otros vértices excepto v 1 ,


v2 , … vk-1, por tanto:

Ck-1 (i, j) = 1

b) Se tiene un camino simple de vi a vk y otro camino simple vk a vJ que no requiere


usar otros vértices excepto v1 , v2 , … vk-1, por tanto:

Ck-1 (i, k) = 1 y Ck-1 (k, j) = 1

De tal modo los valores de la matriz Ck se pueden obtener por la siguiente afirmación:

Ck (i, j)= Ck-1 (i, j)  ( Ck-1 ( i, k )  Ck-1 (k , j) )

2.4.2.2. Construcción de Matriz de Camino

Especificación del Tad y los algoritmos

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

Como observamos esta es la matriz de adyacencia que ingresaremos al programa al ejecutar la


opción 1 del menú.

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

SE HA GENERADO MATRIZ DE CAMINO

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

k i j C k(i, j) = C k-1 (i, j) v (C k-1 (i, k) ^ C k-1(k, j))


0 0 0 0 0 0 0
0 0 1 0 0 0 0
0 0 2 0 0 0 0
0 0 3 1 1 0 1

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 =

k i j C k(i, j) = C k-1 (i, j) v (C k-1 (i, k) ^ C k-1(k, j))


1 0 0 0 0 0 1
1 0 1 0 0 0 0
1 0 2 0 0 0 0
1 0 3 1 1 0 1

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 =

k i j C k(i, j) = C k-1 (i, j) v (C k-1 (i, k) ^ C k-1(k, j))


2 0 0 0 0 0 0
2 0 1 0 0 0 0
2 0 2 0 0 0 0
2 0 3 1 1 0 1

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 =

k i j C k(i, j) = C k-1 (i, j) v (C k-1 (i, k) ^ C k-1(k, j))


3 0 0 1 0 1 1
3 0 1 1 0 1 1
3 0 2 0 0 1 0
3 0 3 1 1 1 1

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 =

2.4.3. Matriz de Camino mínimo

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(e)si hay una arista e de vi a vJ

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:

Q ( i, j ) es igual a la longitud del camino mínimo de vi a vJ

Para lo cual definimos una lista de matrices Q0, Q1,…Qm cuyas entradas estarán dadas por:

Cada Qk (i, j) es igual a la menor longitud de los caminos anteriores de vi a vJ o


también igual a la suma total de las longitudes de los caminos anteriores de vi a vk y
de vk a vJ .

O mas precisamente:

Q 0(i, j) = mínimo (Q k-1 (i, j) , Q k-1 (i, k) + Q k-1(k, j))


Q0 es en realidad la misma matriz de pesos W con la diferencia que cada 0 de W se reemplaza
por un valor numérico muy grande (∞). Así la matriz Qm final será la matriz Q deseada.

Por ejemplo tengamos el grafo siguiente con su respectiva matriz de pesos W:

ABCDA0001B2400C0003D0500
4 2 A

W=
B 1 C
3
5
D

k i j Q k(i, j) = Mínimo( Q k-1 (i, j) , Q k-1 (i, k) + Q k-1(k, j))


0 0 0    
0 0 1    
0 0 2    
0 0 3 1 1  1

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

ABCDA1B243C3D5

Q1 =

k i j Q k(i, j) = Mínimo( Q k-1 (i, j) , Q k-1 (i, k) + Q k-1(k, j))


1 0 0    2
1 0 1    4
1 0 2    
1 0 3 1 1  3

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

ABCDA1B243C3D758

Q2 =

k i j Q k(i, j) = Mínimo( Q k-1 (i, j) , Q k-1 (i, k) + Q k-1(k, j))


2 0 0    
2 0 1    
2 0 2    
2 0 3 1 1  3

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

ABCDA1B243C3D758

Q3 =

k i j Q k(i, j) = Mínimo( Q k-1 (i, j) , Q k-1 (i, k) + Q k-1(k, j))


3 0 0 8  1 7
3 0 1 6  1 5
3 0 2   1 
3 0 3 1 1 1 8

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

ABCDA861B243C1083D75
8
Q4 =

2.4.3.1. Construcción de Matriz de Camino Mínimo

Especificación del TAD y los algoritmos

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

Implementación del TAD en C++


#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
class GRAFO{
int **Q;
int m;
public:
void menu(){
cout<< "\nMENU DE OPCIONES\n";
cout<< "----------------\n" ;
cout<<"<1> Ingresar Matriz de Pesos\n";
cout<<"<2> Mostrar Matriz de Camino Minimo\n";
cout<<"<3> Salir \n";
}
GRAFO(int n){
m=n;
Q= new int*[n]; //vector filas
for (int i=0;i<n;i++)
Q[i] = new int[n];
}
void ingreseMatrizDePesos(){
char elemento[10];
for(int i=0; i<m; i++)
{
cout<<"\n fila "<<i<<"\n";
for(int j=0; j<m; j++)
{
cout<<" j="<<j<<": ";cin>>elemento;
if(!strcmp(elemento,"-"))
Q[i][j]=30000;
else Q[i][j]=atoi(elemento);
}
}
matrizDeCaminoMinimo();
}
void matrizDeCaminoMinimo(){
int i,j,k;
for(k=0;k<m;k++)
for(i=0;i<m;i++)
for(j=0;j<m;j++)
Q[i][j]=MINIMO(Q[i][j],Q[i][k] + Q[k][j]) ;
}
void mostrarMatrizCaminoMinimo(){
int i,j;
for(i=0;i<m;i++)
{
cout << "\n";
for(j=0;j<m;j++)
if(Q[i][j]!=30000) cout << "\t"<<Q[i][j];
else cout << "\t-";//ì";
}
}
int MINIMO(int a, int b)
{
if(a<b || b<0) return(a); else return(b);
}
};
int main()
{
char opcion;
int x;
GRAFO g(4);
do
{
g.menu();
cout<<"\ningrese opcion : ";
opcion=cin.get();
switch(opcion){
case '1':
g.ingreseMatrizDePesos();
break;
case '2':
g.mostrarMatrizCaminoMinimo();
break;
}
cin.ignore();
}
while( opcion !='3');
system(“pause”);
return 0;
}

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

 Software Dev C++


 1 Diskete

4. PROCEDIMIENTO

El procedimiento consiste en dos pasos


 Especificación del TAD
 Implementación del TAD

5. EJERCICIOS RESUELTOS

Ejemplo 01

Halle la matriz de camino sin usar Warshall.

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

Halle la matriz de camino sin usar Warshall.

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

Halle la matriz de camino usando Warshall.

A C

Solución:
011
A=C0= 111
000

k i j Ck (i, j)= Ck-1 (i, j)  (Ck-1 ( i, k ) ^ Ck-1 (k , j))


0 0 0 0 0 0 0
0 0 1 1 1 0 1
0 0 2 1 1 0 1

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

k i j Ck (i, j)= Ck-1 (i, j)  (Ck-1 ( i, k ) ^ Ck-1 (k , j))


1 0 0 1 1 1 1
1 0 1 1 1 1 1
1 0 2 1 1 1 1

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

k i j Ck (i, j)= Ck-1 (i, j)  (Ck-1 ( i, k ) ^ Ck-1 (k , j))


2 0 0 1 1 1 0
2 0 1 1 1 1 0
2 0 2 1 1 1 0

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

En función de las siguientes matrices de adyacencia, halle los grafos correspondientes.

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

5.1. Ejercicios propuestos

1. Halle la matriz de camino para el siguiente grafo sin usar Warshall.

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

6. Halle el grafo en base a su matriz de adyacencia

a) b)
ABCDA1001B1001C0101D0000 ABCDA111B1101C0100D0001
c) d)
ABCA100B010C011 ABCA011B010C011

e) f)
ABCDEA10010B10001C01010D000 ABCDA0111B1001C0100D0111
00E01001

Ejercicio 06

7. Determine que grafos son grafos fuertemente conexos o unilateralmente conexos.

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

8. De los grafos de la pregunta 06 determine si los caminos son simples o no o ambos.

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

9. Escriba la especificación, el algoritmo y el programa para un grafo cuya matriz de


adyacencia se desea implementar usando no arreglos sino mediante asignación dinámica
de memoria y enlaces.
10. Escriba la especificación, el algoritmo y el programa para un grafo donde cada matriz A,
mas la matriz suma B se quieren meter en una lista. Por ejemplo para el grafo G con 4
vértices:
A

B C

en el cual sumando las matrices A, A2, A3 y A4 obtenemos como resultado la matriz B:


A A2 A3 A4
001010001001010 1001001001101000 01101001200100 2001011001201
0 10 001
B= + + +

312221213232211
1
B=

Observe que en algunas de las matrices A, A2, A3 y A4 existen valores mayores de 1, lo


cual significa que hay más de un camino para una longitud determinada.

Se pide ingresar las matrices como se observa en una lista:

raíz
nulo
A A2 A3 A4 B

11. Escriba la especificación, el algoritmo y el programa para un grafo donde su matriz de


adyacencia no se quiere implementar con arreglos ni usando asignación dinámica de
memoria, sino usando filas secuenciales.

También podría gustarte