Вы находитесь на странице: 1из 7

PRÁCTICA NÚMERO 10

APLICACIÓN DE GRAFOS
OBJETIVO

Que el estudiante:

 sea capaz de usar la estructura de un grafo para representar los datos de un problema, analizarlos y
aplicar el algoritmo requerido para resolver un problema.

 que sea capaz de aplicar el algoritmo de Dijkstra para determinar la ruta más corta de un vértice v
a un vértice w de un grafo con pesos.

INTRODUCCIÓN

Existen muchos problemas que pueden representarse con un grafo. Como aplicación de esta estructura de
datos, grafo, proponemos aplicar el algoritmo de Dijkstra que determina la ruta más corta para llegar de un
vértice v a un vértice w en un grafo.

MATERIAL Y EQUIPO NE CESARIO

El estudiante requiere una computadora con compilador de lenguaje C++ o Java.

RELACIÓN CON EL CONTENIDO DEL PROGRAMA DE LA MATERIA ESTRUCTURA DE


DATOS

Esta práctica cubre material de:

Esta práctica cubre material de:

 Unidad IV. Estructuras no lineales.

Práctica Número 10: PRÁCTICA NÚMERO 10


 4.2 Grafos
 4.2.1 Terminología de grafos
 4.2.2 Operaciones básicas sobre grafos.
DEFINICIONES

Un grafo no dirigido es conexo si cada par de vértices están conectados por un camino.

Un grafo con pesos, es un grafo en el cual las aristas tienen pesos. Si la arista e tiene una etiqueta k, se dice
que el peso de e es k.

La longitud de camino, en una gráfica con pesos, es la suma de los pesos de las aristas en el camino.

1
FUNDAMENTOS

Algoritmo de Dijkstra (tomado de [1])

En este algoritmo se asignan etiquetas a los vértices. Sea L(v) la etiqueta del vértice v. En cualquier
momento, algunos vértices tienen etiquetas temporales y el resto tienen etiquetas permanentes. Se define
un conjunto T de los vértices que tienen etiquetas temporales. Si v ya tiene una etiqueta permanente L(v),
entonces ésta es la ruta más corta de a a v. En principio todos los vértices tienen etiquetas temporales. Cada
iteración del algoritmo cambia el estado de una etiqueta de temporal a permanente. El algoritmo concluye
cuando z recibe una etiqueta permanente, L(z) representa entonces la longitud de la ruta más corta.

ALGORITMO

Este algoritmo determina la longitud de una ruta más corta del vértice a al vértice z en un grafo conexo con
pesos. El peso de la arista (i,j) es w(i,j) >0 y la etiqueta del vértice x es L(x). Al concluir, L(z) es la ruta más
corta de a a z.

Entrada: Un grafo conexo con pesos, en la cual todos los pesos son positivos. Los vértices a y z.
Salida: L(z), la longitud de una ruta más corta de a a z.

Algoritmo en pseudocódigo:

1. procedimiento dijkstra(w,a,z,L)
2. L(a)= 0
3. para todos los vértices x  a hacer
4. L(x)= 
5. T = conjunto de todos los vértices //con peso temporal
6. mientras z  T hacer {
7. elegir v  T con L(v) mínimo
8. T = T – {v}
9. para cada x  T adyacentes a v hacer
10. L(x) = minimo(L(x), L(v) + w(v,x)}
11. }

Práctica Número 10: APLICACIÓN DE GRAFOS


12. fin dijkstra

EJEMPLO

Determinar la ruta más corta para ir del vértice f al vértice a.

2
Inicialmente

L:

a b c d e f

     0

v  T con L(v) mínimo: f ; L(f) = 0


T = {a,b,c,d,e}
Vértices x adyacentes a f (sin determinar L(x) mínima): c
L(c) = min(  , 0 + 30) = 30

L:

a b c d e f

  30   0

v  T con L(v) mínimo: c ; L(c) = 30


T = {a,b,d,e}
Vértices x adyacentes a c (sin determinar L(x) mínima): b,d,e

L(b) = min(  , 30 + 31) = 61


L(d) = min(  , 30 + 91) = 121
L(e) = min(  , 30 + 19) = 49

Práctica Número 10: APLICACIÓN DE GRAFOS


L:

a b c d e f

 61 30 121 49 0

v  T con L(v) mínimo: e ; L(e) = 49


T = {a,b,d}
Vértices x adyacentes a e (sin determinar L(x) mínima): d

L(d) = min(121,49+18) = 67

3
L:

a b c d e f

 61 30 67 49 0

v  T con L(v) mínimo: b ; L(b) = 61


T = {a,d}
Vértices x adyacentes a b (sin determinar L(x) mínima): a,d

L(a) = min(  ,61+20) = 81


L(d) = min(67,61+25) = 67

L:

a b c d e f

81 61 30 67 49 0

v  T con L(v) mínimo: d ; L(d) = 67


T = {a}
Vértices x adyacentes a d (sin determinar L(x) mínima): a
L(a) = min(81,67+10) = 77
L:

a b c d e f

Práctica Número 10: APLICACIÓN DE GRAFOS


77 61 30 67 49 0

T={}

La ruta más corta de f a a es:

f -> c -> e -> d -> a

y la longitud de esta ruta es 77

4
METODOLOGÍA

PROGRAMAR

CÓDIGO EN C++ DEL ALGORITMO DE DIJKSTRA


#include <iostream.h>
#include <conio.h>
int dijkstra(int [][8], int [][8], int , int);
int min(int a, int b){
if (a<b) return a;
else return b;
}
void main(){
//minc define la matriz de adyacencias
int minc [8][8] = { {0,1,0,0,0,1,0,0},
{1,0,1,1,1,0,0,0},
{0,1,0,0,1,0,0,1},
{0,1,0,0,1,1,0,0},
{0,1,1,1,0,0,0,0},
{1,0,0,1,0,0,1,0},
{0,0,0,0,1,1,0,1},
{0,0,1,0,0,0,1,0} };
//w define la matriz de pesos
int w [8][8] = { {0,2,0,0,0,1,0,0},
{0,0,2,2,4,0,0,0},
{2,0,0,0,3,0,1,1},
{0,2,0,0,4,3,0,0},
{0,4,3,4,0,0,7,0},
{0,0,0,3,0,0,5,0},
{1,0,0,7,5,0,0,6},
{0,0,1,0,0,0,6,0} };
//a define el origen del camino
//z define el destino

Práctica Número 10: APLICACIÓN DE GRAFOS


int a=0;
int z=7;
int rmc =dijkstra(minc, w,a,z);
cout <<"El camino mas corto es de longitud "<< rmc<<endl
;
}
int dijkstra(int minc[8][8], int w[8][8], int a, int z){
int L[8]= {32767,32767,32767,32767,
32767,32767,32767,32767};
int T[8] = {1,1,1,1,1,1,1,1};
L[a]=0;
cout << endl<<"Origen: "<<a<< ", "<<"destino: "<<z<<endl;
while (T[z] == 1){
//elegir v con L(v) minimo
for (int i=0;i<8;i++)

5
if (T[i] !=0)
break;
int minim = L[i];
int v = i;
for (int j = i+1;j<8;j++)
if ((T[j]!=0)&&(L[j]<minim))
{
minim = L[j];
v = j;
}
cout << "Vértice escogido: "<<v<<", L[x] minimo:"<< minim<<endl;
getch();
T[v] = 0;
cout << "Conjunto T:"<<endl;
for (int k = 0; k<8;k++)
cout << " "<<T[k];
cout <<endl;
for (int x=0;x<8;x++)
if (minc[v][x]==1 && T[x]!=0){
cout << "v="<<v<<" x="<<x;
L[x]=min(L[x], L[v]+w[v][x]);
cout <<", L[x]= "<< L[x]<<endl;
getch();
}
}
return L[z];
}

Dado el código del programa que codifica y usa algoritmo de Dijkstra

 Pruebe el programa.

 Documente el programa.

Práctica Número 10: APLICACIÓN DE GRAFOS


Represente gráficamente el grafo con pesos, que se da como dato de entrada.

 La función dijkstra dada sólo determina la longitud de la ruta más corta, escriba otra una función, o
modifique esta misma para que determine también el camino, la ruta que nos da esa longitud
calculada.

 Modifique lo que sea necesario para que los datos de entrada, sean leídos bajo ejecución de
programa y las matrices sean asignadas dinámicamente de acuerdo al número de vértices de cada
problema en particular.

EVALUACIÓN

REPORTAR

 Lo que se pide en el punto anterior.


6
BIBLIOGRAFÍA

 [1] Matemáticas Discretas. Johnsonbaugh. Prentice Hall. 4a. Edición. 1999. Capítulo 6..

 Estructuras de Datos. Cairó y Guardati. Mc Graw Hill. 2a. Edición. 2002. Capítulo 7.

 Matemáticas Discretas. Bases Elementales. Guillén Velasco, García Martínez, Martínez Chávez,
Casarez, Morris y Diez. Editado en el ITCJ. 2003. Teoría de Grafos páginas (54-65).

SUGERENCIAS DIDÁCTICAS

Se sugiere que la práctica sea realizada en equipos de dos personas.

Práctica Número 10: APLICACIÓN DE GRAFOS

Вам также может понравиться