HA
INSTITUTO POLITCNICO NACIONAL
DI ME A
SECRETARIA ACADMICA A S O
DIRECCIN DE EDUCACIN SUPERIOR INGENIERA EN COMPUTACIN
ESIME CULHUACAN
PRCTICA No. 17
GRAFOS
1. Objetivo
2. Material y Equipo
3. Introduccin terica
Conceptos bsicos
Definicin de grafo
Lazos o bucles
Un lazo o bucle es una arista que relaciona al mismo nodo; es decir, una arista donde el
nodo inicial y el nodo final coinciden.
Grafo no dirigido
es un conjunto de pares no ordenados de
elementos de.
Un par no ordenado es un conjunto de la forma {a,b}, de manera que {a,b} = {b,a}. Para
los grafos, estos conjuntos pertenecen al conjunto potencia de V de cardinalidad 2, el
cual se denota por .
Grafo dirigido
es un conjunto de pares
Un grafo mixto es aquel que se define con la capacidad de poder contener aristas
dirigidas y no dirigidas. Tanto los grafos dirigidos como los no dirigidos son casos
particulares de este.
Pseudografo
202
Pseudografo dirigido
Por otra parte, si se quiere asegurar la posibilidad de permitir mltiples aristas, el grafo
puede llamarse multigrado (a veces se utiliza el trmino pseudografo para indicar que
se permiten tanto bucles como mltiples aristas entre cada par de vrtices).
Propiedades
203
Algoritmos de grafos
Algoritmo de Dijkstra
Una posible aplicacin de este algoritmo se presenta ciando se desea encontrar la ruta
ms corta entre dos ciudades, cada vrtice representa una ciudad y el peso de las
aristas indica la duracin de los vuelos.
Algoritmo de Floyd
La matriz de distancias sirve como punto de partida para este logaritmo. Se realizan k
iteraciones sobre la matriz buscando el camino ms corto; por lo tanto, en la ksima
iteracin, M[i,j] tendr el camino de menor costo para llegar de i a j, pasando por un
nmero de vrtices menor a k, el cual se calcular segn la siguiente expresin:
Mk[i,j]min = Mk1[i,j] o
204
M[i,j] ser igual al costo de ir de i a j, aun valor muy grande () si no existe camino de i
a j, o cero si i = j.
Algoritmo de Warshall
DIJKSTRA
if (min == HUGE_VAL)
{
cout <<"No Existe\n"; cout <<"\tCoste: \t \n";
}
else
{
i=
destino; i
= ant[i1];
while (i != 1)
{
tmp[cont] = i+1; cont++; i = ant[i]; }
for (i = cont; i > 0; i) { cout<< tmp[i1]<<" > "; }
cout << destino; cout <<"\n\tCoste: " << dist[destino1] <<"\n";
}
delete (dist); delete (ant); delete (tmp); delete (z);
}
void buscar(void)
{
int i, j;
cout <<" Lista de los Menores Caminos en Grafo Dado: \n";
for (i = 1; i <= vertices; i++)
{
for (j = 1; j <= vertices; j+
+) dijkstra(vertices, i,j,
costos); cout<<endl;
}
cout <<"<Presione ENTER para volver al menu principal. \n";
}
209
FLOYD
#include <stdio.h>
#include <stdlib.h>
#include "util.h"
#define N 4 int A[N*N] = {0,1,0,0,0,0,1,1,0,0,0,0,1,0,1,0};
int main(int argc, char **argv)
{
volcarMatriz(A,N);
int a, b;
for (int k = 0; k < N; k++)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
a = A[i*N+k];
b = A[k*N+j];
if ((i != j) && (a * b != 0))
{
if (A[CURR] ==
0) A[CURR] = a +
b;
}
else
A[CURR] = min(A[CURR], a + b);
}
}
}
DBG_LOG("\n");
volcarMatriz(A,N);
return 0;
}
WARSHALL
5. Cuestionario [Trabajo Complementario]