Documente Academic
Documente Profesional
Documente Cultură
INGENERIA DE SISTEMA
ESTRUCTURA DE DATOS
SEMESTRE III
Concepto y Aplicaciones.
Concepto.
La teoría de grafos es una disciplina antigua con muchas aplicaciones modernas.
Sus ideas básicas las introdujo el gran matemático suizo Leonhard Euler en el siglo
XVIII. Euler utilizo los grafos para resolver el famoso problema de los puentes de
Königsberg. Los grafos se emplean para resolver problemas de diversas ´áreas.
Pueden utilizarse, por ejemplo, para determinar si se puede o no implementar un
circuito sobre una placa de una sola capa, para estudiar la estructura de una red de
internet, para determinar si dos ordenadores están conectados o no dentro de una
red informática, para hallar el camino más corto entre dos ciudades en una red de
transportes, ... El primer trabajo sobre la teoría de grafos aparece en 1736 y fue
escrito por el matemático Leonhard Euler (1700-1783). Este trabajo comienza con
la discusión de un problema surgido en la ciudad de Königsberg (ahora
Kaliningrado, Rusia). La ciudad estaba dividida en cuatro partes por los dos brazos
en los que se bifurca el río Pregel. Estas cuatro partes eran las dos regiones a orillas
del río Pregel, la isla de Kneiphof y la región que quedaba entre ambos brazos del
río. Siete puentes conectaban entre sí estas regiones en el Siglo XVII. La figura
siguiente ilustra las regiones y los puentes.
Los habitantes se preguntaban: ¿Es posible recorrer los siete puentes pasando por
todos ellos una única vez, partiendo y llegando al mismo sitio? Para tratar de
resolver el problema, conocido como Problema de los puentes de Königsberg, Euler
representó esquemáticamente las ´áreas de tierra por puntos y los puentes por
líneas conectando esos puntos. El resultado constituye un ejemplo de grafo:
Definición:
Se dice que un lado e = (v, w) de un grafo (dirigido o no dirigido) es incidente
en v y w. Se dice que los vértices v y w son incidentes en e y también que los
vértices son adyacentes.
Si G es un grafo (dirigido o no dirigido) con un conjunto de vértices V y un conjunto
de lados E, se escribe G = (V, E).
Ejemplo:
G
Este grafo G consta de un conjunto V de vértices
V = {S, T, U, V, W, X, Y, Z}
y el conjunto de lados
E = {e1, e2, e3, .... , e11 }.
El lado e1 esta asociado con el par no ordenado {T, U}, el lado e10 esta asociado
al par no ordenado {S, X}. El lado e1 se denota por (U, T) o bien (T, U). El lado e4
es incidente en los vértices Y y Z por lo que Y y Z son vértices adyacentes.
Ejemplo:
G
En este dígrafo los lados dirigidos están indicados por flechas. El lado e 1 esta
asociado al par ordenado de vértices (v2 , v1) por lo que se escribe e1 = (v2 , v1) y el
lado e7 con el par ordenado (v6, v6), por lo que se escribe e7 = (v6, v6).
Grado entrante de un vértice.
El grado entrante de un vértice es el número de aristas que llegan al vértice.
Grado de un vértice.
Ejemplo: de la figura, el vértice a tiene grado total igual a 3; vértice b, grado 3; vértice
c, grado 2; vértice d, grado 1; vértice e, grado 1.
Bucle o Lazo.
es una secuencia que ejecuta repetidas veces un trozo de código, hasta que la
condición asignada a dicho bucle deja de cumplirse. Los tres bucles más utilizados
en programación son el bucle while, el bucle for y el bucle do-while.
El bucle for o ciclo for
es una estructura de control en programación en la que se puede indicar de
antemano el número mínimo de iteraciones que la instrucción realizará. Está
disponible en casi todos los lenguajes de programación imperativos.
“Variable de control': prácticamente un mandato impuesto por el uso habitual es
utilizar la letra i Iterador como variable de control, o bien sus sucesoras en caso de
bucles anidados.
El bucle while o bucle mientras
es un ciclo repetitivo basado en los resultados de una
expresión lógica, se encuentra en la mayoría de
la programación estructurados. El propósito es repetir
un bloque de código mientras una condición se mantenga
verdadera.
El bucle do, bucle hacer
hacer-mientras o también llamado ciclo do-while, es
una estructura de control de la mayoría de los lenguajes de
programación estructurados cuyo propósito es ejecutar un bloque
de código y repetir la ejecución mientras se cumpla cierta condición
expresada en la cláusula while. La diferencia con el bucle while
radica en que este evalúa la condición al principio, y si esta no se
cumple, el código que está encerrado dentro del cuerpo no se
ejecuta. En cambio, el bucle do-while evalúa la condición para
seguir ejecutándose luego de haber ejecutado el código dentro de
su cuerpo; es decir, siempre se ejecuta por lo menos una vez el
código.
Algoritmo de Dijkstra y Ford
Algoritmo de Dijkstra:
El Algoritmo de Dijkstra se controlará desde el panel situado en la parte izquierda
del applet. En la siguiente figura se muestra cómo se comporta el panel cuando
estamos editando un algoritmo (parte izquierda de la figura) y cuando estamos
trazando un algoritmo (parte derecha de la figura).
Sobre cada nodo se representa la distancia estimada para este en cada iteración.
Este panel contiene una barra de scroll que para desplazar el área que ocupan los
nodos.
Por su parte el panel de edición de algoritmos podría tener el siguiente aspecto:
donde los colores de los nodos tienen el mismo significado que el representado por
la tabla anterior.
Los arcos de color azul representan los caminos mínimos desde el origen a cada
uno de los nodos. Los arcos de color verde representan el camino desde el nodo
origen al nodo que en ese momento es el nodo actual.
En el panel del Algoritmo de Dijkstra en la parte inferior existen cuatro
seleccionables que sirven para mostrar u ocultar, en el panel de edición de
algoritmos, los elementos anteriormente comentados.
Por último, hacer notar que, cuando estamos trazando un algoritmo, las fichas del
resto de los algoritmos (parte superior del panel) se encuentran desactivadas, y no
podemos pasar a otro algoritmo hasta que el que esté en curso no finalice, mediante
el botón “Terminar” en la barra de herramientas.
Bellman-Ford (G,s)
Inicializar
do d[v] = infinito
p[v] = nulo
p[s] = 0
for i=1 to V[G]-1
Relajación
p(v) = u
return VERDADERO
Inicializar
do d[v] = - infinito
p[v] = nulo
p[s] = 0
Relajación
p(v) = u
Puede encontrar más información en:
▪ Richard E. Bellman
▪ L. R. Ford Jr.
▪ Delbert Ray Fulkerson prize
▪ Bellman, R. E., On a routing problem, quarterly of Applied Mathematics, 16,
87-90, 1958.
▪ Ford, L. R.Jr., Network Flow Theory, Paper P-923, RAND Corporation, Santa
Monica, California, 1956.
ejemplo de camino mínimo
* 0 ----(5)---> 3
* 3 ----(2)---> 4
Coste total = 7
N1\N2 0 1 2 3 4
0 0 0 0 1 0
1 0 0 0 0 0
2 0 0 0 0 0
3 0 0 0 0 1
4 0 0 0 0 0