Академический Документы
Профессиональный Документы
Культура Документы
=
0 0 0 1 1
0 0 1 0 0
0 0 0 1 0
1 0 0 1 0
1 1 0 1 1
A
Finalmente ingresamos al programa el nmero de nodos que es 5 y matriz de
adyacencia A.
Dnde la matriz obtenida es la matriz de caminos P:
(
(
(
(
(
(
=
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
P
2) Dado el grafo ponderado G, con vrtices enumerados desde 1 al 6 y de manera
arbitraria se numera las aristas como se muestra en la figura, encontrar el matriz
de caminos mnimo.
1
2
3
5
4
1
2
7
4
5 1
0
8
6
3
MATEMATICA DISCRETA Pgina 9
Primeramente construimos la matriz de pesos A del grafo.
(
(
(
(
(
(
(
(
=
0 0 0 0 0 9
0 0 3 0 0 0
0 0 0 0 0 0
1 8 6 0 0 0
0 0 0 1 0 7
5 0 0 4 2 0
A
Luego ingresamos al programa el nmero de nodos que es 6 y la matriz A.
Donde la matriz obtenida es la matriz P de caminos mnimos.
MATEMATICA DISCRETA Pgina 10
(
(
(
(
(
(
(
(
=
13 20 18 12 11 9
0 0 3 0 0 0
0 0 0 0 0 0
1 8 6 13 12 10
2 9 7 1 9 7
4 11 9 3 2 9
P
ALGUNOS PROBLEMAS CONCURSO DE PROGRAMACIN ACM
Se conocen las distancias entre cierto nmero de ciudades. Un viajante debe, a
partir de unas de ellas, visitar cada ciudad exactamente una vez y regresar al punto
de partida habiendo recorrido en total la menor distancia posible.
Observacin: Este problema tambin puede ser enunciado tambin de la siguiente
manera: Dado un grafo G conexo y ponderado y dado uno de sus vrtices ,
encontrar el ciclo Halmintoniano de coste mnimo que comienza y termina en .
Un camionero conduce desde Bilbao a Mlaga siguiendo una ruta dada y
llevando un camin que le permite, con el tanque lleno, recorrer kilmetros sin
parar. El camionero dispone de un mapa de carreteras que le indica las distancias
entre las gasolineras que hay en su ruta. Como va con prisa, el camionero desea
pararse a repostar el menor nmero de veces posible.
Observacin: se puede aplicar el Algoritmo de Warshall para caminos mnimos.
Unos ambiciosos ingenieros tienen pensado construir una gran ciudad a partir de
unos planos que elaboraron. El plano de la ciudad consta de esquinas y
calles bidireccionales. Cada calle une a lo ms a dos esquinas. Se dice que existe
un camino que une a dos esquinas y , si , si hay una calle conectando
directamente a las dos esquinas, o si existe una secuencia de esquinas
, tal que , y toda (menos ) est unida
directamente con por una calle. Los ingenieros se preguntan si habrn
planificado mal algo, como por ejemplo, que si una persona vive en una esquina A y
quiere ir a visitar a un amigo que vive en una esquina B, no exista un camino que le
permita llegar a la esquina B.
V. PSEUDOCODIGO
ALGORITMO DE WARSHALL
Programa algoritmoWarshall
Variables:
Entero: A[100][100];
Carcter: respuesta;
Inicio
Leer n;
Llamar CargarMat( A, n);
MATEMATICA DISCRETA Pgina 11
Llamar algWarshall ( A, n );
Llamar mostrar( A, n );
Leer resp;
Si ( resp == n o resp == N) entonces
Retornar 0;
Fin_si;
Fin
Funcin operadorAND (entero A,entero B)
Devolver entero;
Variables:
Enteros: c,opcin;
Inicio
opcion A;
Segn (opcin) hacer
caso 0:
si (B==0) hacer
c 0;
si (B==1) hacer
c 0;
caso 1:
si (B==0) hacer
c 0;
si (B==1) hacer
c 1;
Retornar c;
Fin_segn
Fin
Funcin operadorOR (entero A,entero B)
Devolver entero;
Variables:
Enteros: c,opcin;
Inicio
opcion A;
Segn (opcin) hacer
caso 0:
si (B==0) hacer
c 0;
si (B==1) hacer
c 1;
caso 1:
si (B==0) hacer
MATEMATICA DISCRETA Pgina 12
c 1;
si (B==1) hacer
c 1;
Fin_segn
Fin
Funcin CargarMat( entero A[][100], entero n)
Devolver vaco;
Inicio
Para entero i, desde 1 hasta n hacer
Para entero j, desde 1 hasta n hacer
Leer A[i][j];
Fin_para
Fin_para
Fin
Funcin AlgWarshall( entero A[][100], entero n)
Devolver vaco;
Inicio
Para entero k, desde 1 hasta n hacer
Para entero i, desde 1 hasta n hacer
Para entero j, desde 1 hasta n hacer
A[ i ][ j ] = operadorOR( A[ i ][ j ], operadorAND( A[ i ][ k ],
A[ k ][ j ] ) );
Fin_para
Fin_para
Fin_para
Fin
Funcin Mostrar (entero A[][100], entero n)
Devolver vaco;
Inicio
Para entero i, desde 1 hasta n hacer
Para entero j, desde 1 hasta n hacer
Escribir A[i][j];
Fin_para
Escribir (fin de lnea);
Fin_para
Fin
ALGORITMO DE FLOYD Y WARSHALL
Constante INF = 10000
MATEMATICA DISCRETA Pgina 13
Programa warshallCaminoMinimo
Variables:
Entero: A[100][100], n;
Carcter: resp;
Inicio
Leer n;
Llamar CargarMat( A, n );
Llamar matrizNuevo( A, n );
Llamar algWarshall( A, n );
Llamar matrizCamino( A, n );
Llamar Mostrar( A, n );
Leer resp;
Si ( resp == n o resp == N) entonces
Retornar 0;
Fin_si
FIn
Funcin CargarMat( entero A[][100], entero n )
Devolver vaco;
Inicio
Para entero i, desde 1 hasta n hacer
Para entero j, desde 1 hasta n hacer
Leer A[i][j];
Fin_para
Fin_para
Fin
Funcin matrizNuevo( entero A[][100], entero n )
Devolver vaco;
Inicio
Para entero i, desde 1 hasta n hacer
Para entero j, desde 1 hasta n hacer
Si ( A[i][j] == 0) entonces
A[i][j] INF ;
Fin_si
Fin_para
Fin_para
Fin
Funcin Mostrar( entero A[][100], entero n )
Devolver vaco;
Inicio
MATEMATICA DISCRETA Pgina 14
Para entero i, desde 1 hasta n hacer
Para entero j, desde 1 hasta n hacer
Escribir A[i][j];
Fin_para
Escribir (fin de lnea);
Fin_para
Fin
Entero minValor( entero A, entero B )
Devolver entero;
Variabes:
Entero: menor;
Inicio
menor A;
Si ( menor > B) entonces
menor B;
Fin_si
retornar menor;
Fin
Funcin algWarshall( entero A[][100], entero n )
Devolver vaco;
Inicio
Para entero k, desde 1 hasta n hacer
Para entero i, desde 1 hasta n hacer
Para entero j, desde 1 hasta n hacer
A[ i ][ j ] = minValor( A[ i ][ j ] , A[ i ][ k ] + A[ k ][ j ] );
Fin_para
Fin_para
Fin_para
Fin
Funcin matrizCamino( entero A[][100], entero n )
Devolver vaco;
Inicio
Para entero i, desde 1 hasta n hacer
Para entero j, desde 1 hasta n hacer
Si ( A[i][j] >=INF) entonces
A[i][j] 0 ;
Fin_si
Fin_para
Fin_para
MATEMATICA DISCRETA Pgina 15
Fin