Está en la página 1de 25

Algoritmos y Estructuras de Datos III

Facultad de Informtica, Grupo 2B


a
Universidad Politcnica de Valencia
e

Tema 2:

Grafos y Arboles
Enrique Vidal Ruiz
evidal@iti.upv.es
Octubre, 2000

E. Vidal UPV


AD3-Grafos-Arboles-2

Octubre, 2000

Grafos y Arboles:
Indice
1. Deniciones

2. Arboles
3. Represemtacin de grafos y rboles
o
a
4. Recorridos bsicos de rboles
a
a

Bibliograf
a:
Cormen Leiserson y Rivest: Introduction to Algorithms, MIT press, 1990.
Aho, Hopcroft y Ullman: The Design and Analysis of Computer Algorithms,
AddisonWesley, 1974.

E. Vidal UPV

Pgina 2.1
a


AD3-Grafos-Arboles-2

Octubre, 2000

Grafos: Deniciones
Grafo Dirigido:
Es un par G = (V, A) donde V es un conjunto nito de elementos llamados
vrtices y A V V es un conjunto nito de pares ordenados de vrtices
e
e
llamados aristas. Si a = (u, v) es una arista de G, se dice que a entra o
incide en v y que a sale o emerge de u.
Grafo no Dirigido:
Es un par G = (A, V ) donde V es un conjunto nito de vrtices y
e
A {{u, v} | u, v V v = u} es un conjunto de pares no ordenados de
vrtices.
e
Equivalentemente, G es un Grafo no Dirigido si G es un Grafo Dirigido y
u, v V, (u, v) A (v, u) A. Si a = ({u, v} es un arco no dirigido,
se dice que a une a u y v y que a incide en u y en v. En lo que sigue nos
referiremos siempre a Grafos Dirigidos, a menos que se indique lo contrario.

E. Vidal UPV

Pgina 2.2
a


AD3-Grafos-Arboles-2

Octubre, 2000

Grafos: Deniciones (cont.)


Grado: Para todo vrtice v, Grado de Entrada es el nmero de aristas que inciden
e
u
en v; Grado de Salida es el nmero de aristas que emergen de v; Grado es la
u
suma de los grados de entrada y salida de v. Grado de un Grafo es el mximo
a
grado de sus vrtices.
e
Camino desde un vrtice u V a un vrtice v V : es una secuencia
e
e
< v0, v1, . . . , vk > de vrtices de G = (V, A) tal que v0 u, vk v, (vi, vi+1) A,
e
0 i < k. La Longitud de un Camino < v0, v1, . . . , vk > es el nmero (k) de
u
aristas que lo forman.
Camino Simple: es un camino en el que todos sus vrtices son distintos.
e
Ciclo: es un camino simple < v0, v1, . . . , vk > tal que v0 = vk .
Grafo Ac
clico: es un grafo sin ciclos.
Subgrafo: G = (V , A ) es un Subgrafo de G = (V, A) si V V A A.
Subgrafo Inducido:
por V V es un subgrafo G = (V , A ) tal que A = {(u, v) A | u, v V }.
E. Vidal UPV

Pgina 2.3
a


AD3-Grafos-Arboles-2

Octubre, 2000

Grafos: Deniciones (cont.)


Vrtice Alcanzable desde un vrtice u: es cualquier vrtice v para el que existe
e
e
e
un camino de u a v.
Grafo (Furtemente) Conexo: Es un grafo (Dirigido) G = (V, A) en el que
e
u, v V , v es alcanzable desde u.
Componentes (Furtemente) Conexas de un Grafo (Dirigido): Son las clases
e
de equivalencia de vrtices segn la relacin ser mtuamnete alcanzable.
e
u
o
u
Grafo Completo: es un grafo G = (V, A) en el que u, v V, u = v, (u, v) A
Grafos Isomorfos: Dos grafos G = (V, A), G = (V , A ) son isomorfos si existe una
biyeccin f : V V tal que (u, v) A (f (u), f (v)) A
o
Grafo Etiquetado: Es un grafo G = (V, A) acompaado de una funcin f : A E,
n
o
donde E es un conjunto cuyas componentes se denominan etiquetas.
Grafo Ponderado: Es un grafo etiquetado con nmeros reales (E )
u
E. Vidal UPV

Pgina 2.4
a


AD3-Grafos-Arboles-2

Octubre, 2000

Arboles
Bosque: Es un grafo no dirigido ac
clico.
Arbol Libre: Es un grafo no dirigido ac
clico conexo.
Teorema 1.
Si G es un grafo con M > 2 vrtices, entonces los
e
siguientes predicados son equivalentes:
1. G es un rbol libre
a
2. G es conexo y tiene M 1 aristas
3. Cualquier par de vrtices estn conectados por un unico camino
e
a

4. Si se aade una arista a G se crea un ciclo


n
Arbol de Recubrimiento de un grafo no Dirigido G = (V, A): es un rbol
a
libre T = (V A ) tal que V = V y A A.
Arbol Enraizado: Es un rbol libre con un vrtice distinguido denominado ra La
a
e
z.
ra de un rbol A se denota como raiz(A), o simplemente A si no hay confusin.
z
a
o
E. Vidal UPV

Pgina 2.5
a


AD3-Grafos-Arboles-2

Octubre, 2000

Arboles Enraizados

Sea A un Arbol Enraizado en el vrtice r y sea v un vrtice de A. Sea C el unico


e
e

camino de la r a v:
Se dice que un vrtice u es Antecesor o Predecesor de v, si u est en C. En
e
a
este caso tambin se dice que v es Descendiente o Sucesor u,
e
Si (u, v) es la ultima arista de C, se dice que u es el (nico) Padre de v y se

u
denota como u = p(v). As
mismo, se dice que v es un Hijo de u. El conjunto de
hijos de un vrtice se denota como hijos().
e
Dos vrtices , de A son Hermanos, si p( ) = p().
e
Se dice que un vrtice es una Hoja si hijos() = . Nodos Internos son
e
aquellos vrtices que no son hojas.
e
La Profundidad de v en A es la longitud de del camino C desde la ra hasta v.
z
Altura de A, h(A), es la profundidad de la hoja de mxima profundidad.
a
El Grado de un vrtice se dene como la talla de hijos().
e
E. Vidal UPV

Pgina 2.6
a


AD3-Grafos-Arboles-2

Octubre, 2000

Arboles Binarios

Arbol Ordenado es un Arbol Enraizado en el que los hijos de cada vrtice


e
estn ordenados.
a

Arbol Posicional k-Ario es un Arbol Ordenado cuyos vrtices tienen a lo sumo


e
un grado k. Como en cada vrtice hay un orden establecido para los hijos, stos
e
e
pueden numerarse de 1 a j k.

Arbol Binario (AB) es un Arbol Posicional k-Ario con k = 2. Una denicin


o
recursiva alternativa es:
Un AB es un Conjunto Vac de elementos llamado Nodos o Vrtices, o bin
o
e
e
una estructura compuesta de de 3 conjuntos disjuntos de nodos:
1. Un nodo privilegiado llamado Ra
z.
2. Un AB llamado Subrbol Izquierdo.
a
3. Un AB llamado Subrbol Derecho.
a
La ra de un Subrbol Izquierdo (no vac de un nodo se denomina Hijo
z
a
o)
Izquierdo de y la de su Subrbol Derecho se denomina Hijo Derecho de .
a

E. Vidal UPV

Pgina 2.7
a


AD3-Grafos-Arboles-2

Octubre, 2000

Arboles Binarios (cont.)


Nivel k-simo de un AB es el conjunto de nodos cuya profundidad es k.
e
Un AB es Pleno si todos sus nodos internos tienen exactamente 2 hijos.
Un AB es Completo si es Pleno y todas sus hojas tienen exactamente la misma
profundidad.
Un AB es Casi-Completo si todos sus niveles estn completos, excepto
a
pos
blemente el ms profundo, en cuyo caso las hojas ocupan las posiciones
a
de ms a la izquierda.
a
Propiedades de un AB Completo:
El nmero de nodos en el nivel k-simo es 2k .
u
e
El nmero total de nodos desde la ra hasta el nivel k-simo es 2k+1 1,
u
z
e
El nmero total de nodos internos desde la ra hasta el nivel k-simo es 2k 1.
u
z
e
Notacin
o
izq(): Hijo (o subrbol) izquierdo de .
a
der(): Hijo (o subrbol) derecho de .
a
E. Vidal UPV

Pgina 2.8
a


AD3-Grafos-Arboles-2

Octubre, 2000

Recorridos de Arboles Binarios


Un recorrido de un rbol (binario) A es una secuencia o lista
a
de nodos < 1, 2, . . . , n > que visita todos los n nodos de A
de alguna forma sistemtica. Tres tipos bsocos de recorridos:
a
a
preOrd, u Orden Previo
inOrd, u Orden Interno o Simtrico
e
postOrd, u Orden Posterior
Deniciones recursivas:
1. Si A = N U LO,
preOrd(A) = inOrd(A) = postOrd(A) = listaV acia.
2. Sea r = raiz(A), A1 = izq(A), A2 = der(A)
preOrd(A) = < r, preOrd(A1), preOrd(A2) >
inOrd(A) = < inOrd(A1), r, inOrd(A2) >
postOrd(A) = < postOrd(A1), postOrd(A2), r >
E. Vidal UPV

Pgina 2.9
a


AD3-Grafos-Arboles-2

Octubre, 2000

Recorridos de Arboles Binarios: ejemplos


Orden Previo

Orden Simtrico
e
A

A
B

I
J

C
E

C
E

Orden Posterior

F
I

D
G

F
I

preOrd(A) = < A, B, D, E, H, J, I, C, F, G >


inOrd(A) = < D, B, H, J, E, I, A, F, F, G, C >
postOrd(A) = < D, J, H, I, E, B, G, F, C, A >

E. Vidal UPV

Pgina 2.10
a


AD3-Grafos-Arboles-2

Octubre, 2000

Representacin de Grafos
o

Listas de Adyacencia: Un grafo G = (V, A) se representa como


un vector de listas de vrtices indexado por vrtices. Cada
e
e
componente Gv es una lista de los vrtices emergentes y/o
e
incidentes de/a v V .
Memoria: O(|V | + |A|);

Tiempo acceso: O(grado(G)).

Matriz de Adyacencias: Un grafo G = (V, A) se representa


como G: matriz[V,V] de Booleanos. La componente Gu,v es 1 si
(u, v) A; sino Gu,v = 0.
Memoria: O(|V |2; Tiempo acceso: O(1).

E. Vidal UPV

Pgina 2.11
a


AD3-Grafos-Arboles-2

Octubre, 2000

Representacin de Grafos: Ejemplos


o
Lista de Ayacencia

Matriz de Adyacencia

Grafo Dirigido
G

5
2

4
4

2
3

Grafo No Dirigido

G
1

E. Vidal UPV

2
3

Pgina 2.12
a


AD3-Grafos-Arboles-2

Octubre, 2000

Representaciones Espec
cas para Arboles: Ejemplos

Arboles Cualesquiera (Ordenados)


(mediante punteros)

hijoMasIzq(v)

p(v)
elem(v)
hermDer(v)

B
-

Q
-

E. Vidal UPV

Arboles k-Arios (k=6)


(representacin h
o brida)

B
-

B
-

W
- - - - - -

Q
- - - - - -

p(v)
elem(v)
hijos(v)

- -

A
- - - - - -

F
- -

B
- - - - - -

Pgina 2.13
a


AD3-Grafos-Arboles-2

Octubre, 2000

Representaciones Espec
cas para Arboles (cont.)

Representacin adecuada para aplicaciones en las que, para cada vrtice,


o
e
es suciente con poder acceer a su padre.
Estructura representada mediante un vector T indexado
por vrtices. Para cada vrtice v, p(v) = T [v].
e
e

10

T:

2
j

6
8
h

E. Vidal UPV

4 5
c

10
i

7
2

Pgina 2.14
a


AD3-Grafos-Arboles-2

Octubre, 2000

Representacin de Arboles Binarios


o
Representacin h
o brida como

Arbol Posicional k-Ario, con k = 2.

p(v)
elem(v)
der(v)

izq(v)

A
-

Representacin espec
o
ca de un AB, A en un vector, V (particularmente util si A

es (Casi-)Completo): Un nodo es un
ndice i del vector, y V [i] almacena elem(i);
es decir, la informacin adicional convnienete para la aplicacin.
o
o
g

$%#201)'$%#" 
! ( & !

 


$%#! 3


E. Vidal UPV

p(i) = i/2
izq(i) = 2 i
der(i) = 2 i + 1
raiz(A) = 1

Pgina 2.15
a


AD3-Grafos-Arboles-2

Octubre, 2000

Programa de prueba de Representacin de Grafos: pruGraph


o
/*
Representacin de Grafos: Estructuras de datos y su manejo
o
*/
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
/* ----------------------------- Macro para facilitar reservas de memoria */
#dene GETMEM(cantidad,tipo) (tipo *)malloc(cantidad*sizeof(tipo))
/* ---------------------------------------------------------------------- */
/*
Variables globales */
#dene maxNodos 128
#dene maxSem
INT_MAX-1
typedef char grafMatriz[maxNodos][maxNodos];
grafMatriz GM;

/* Matriz de Adyacencia */

typedef struct arist { int nodo; struct arist *sig; } Arista;


typedef Arista *grafListas[maxNodos];
grafListas GL;
/* Vector de Listas de Adyacencia */
E. Vidal UPV

Pgina 2.16
a


AD3-Grafos-Arboles-2

Octubre, 2000

/* ====================================================================== */
void main(int argc, char *argv[]) {
Arista *a,*b;
oat grado=3.0; int i,j, fil,col, tll, semilla=1, talla=5,
lisDosGraf=0, listaMat=0, noDirigido=0, leerAris=0;
/* -------------------------------------------------------------------breve ayuda on-line */
#dene printHelp(mensaje) fprintf(stderr, "
Prueba de Estructuras de Datos para representacin de Grafos: Genera una
o
Matriz de Adyacencia aleatoria (o la lee de stdin), la convierte a Lista
de Adyacencia y produce listados de los grafos en formato grfico dot.\n
a
Uso: %s [Opciones]
Opciones:
-h
Muestra esta ayuda
-l
Lee las Aristas por la entrada standard (stdin)
-d
Lista dos grafos, el segundo a partir de la Lista de Adyacencia
-m
Lista la matriz de adyacencia (por stderr)
-N
Genera un Grafo No Dirigido
-s <num> Semilla para la generacin datos aleatorios {0..%d}[%d]
o
-t <num> Talla (nmero de vrtices) del Grafo a generar {1..%d}[%d]
u
e
-g <num> grado medio (aristas/nodos) del Grafo a generar {1..%d}[%3.1f]
%s\n", argv[0], maxSem,semilla, maxNodos,talla, talla,grado, mensaje);
E. Vidal UPV

Pgina 2.17
a


AD3-Grafos-Arboles-2

Octubre, 2000

/* -------------------------------------------------------------------Anlisis de opciones y argumentos


a
*/
#dene opcion(jj,arg) (strcmp(argv[jj],arg)==0)
#dene argVal(jj,arg) ((strcmp(argv[jj],arg)==0) && (jj+1<argc))
#dene FR(var,mini,maxi) ((var<mini) || (var>maxi)) /* Fuera de Rango */
if (argc>10) {printHelp("Demasiados argumentos"); exit(1);}
for (i=1; i<argc; i++) {
/* Lectura de opciones y argumentos */
if
opcion(i,"-h") {printHelp(""); exit(1);}
else if opcion(i,"-l") leerAris=1;
else if opcion(i,"-d") lisDosGraf=1;
else if opcion(i,"-m") listaMat=1;
else if opcion(i,"-N") noDirigido=1;
else if argVal(i,"-s") semilla = atoi(argv[++i]);
else if argVal(i,"-t") talla
= atoi(argv[++i]);
else if argVal(i,"-g") grado
= atof(argv[++i]);
else {printHelp("\n**Error: opcin desconocida\n"); exit(1);}
o
}
if ( FR(semilla,0,maxSem) || FR(talla,1,maxNodos) || FR(grado,0.1,talla) )
{ printHelp("\n**Error: algn parmetro fuera de rango\n"); exit(1); }
u
a
E. Vidal UPV

Pgina 2.18
a


AD3-Grafos-Arboles-2

Octubre, 2000

/* -------------------------------------------------------------------Lectura y/o generacin de los grafos


o
if (leerAris) {
/* Lee Aristas por stdin
for (i=0; i<talla; i++) for (j=0; j<talla; j++) GM[i][j]=0;
fprintf(stderr,"Pares de vrtices separados por comas/blancos:\n");
e
while((scanf(" %d,%d", &i,&j) != EOF) &&
(i>=0) && (j>=0) && (i<talla) && (j<talla))
GM[i][j]=1;
}
else {
/* genera grafo aleatorio como Matriz de Adyacencia
srand(semilla);
for (i=0; i<(int )(talla*grado); i++) {
fil = rand() % talla; col = rand() % talla;
if
(!noDirigido) GM[fil][col]=1;
else if (fil!=col) {GM[fil][col]=1; GM[col][fil]=1;}
}
}
for (i=0; i<talla; i++) {
/* representa GM como Listas de Adyacencia
GL[i]=NULL;
for (j=0; j<talla; j++) if (GM[i][j])
{ b = GETMEM(1,Arista); b->nodo=j; a=GL[i]; GL[i]=b; b->sig=a;
}
E. Vidal UPV

*/
*/

*/

*/

Pgina 2.19
a


AD3-Grafos-Arboles-2

Octubre, 2000

/* -------------------------------------------------------------------Listados para grfico mediante dot


a
*/
printf("digraph G {\nsize=\"10.5,7.5\";ratio=0.7;rankdir=LR;rotate=90; ");
if (noDirigido) printf("edge [dir=none];");
for (i=0; i<talla; i++) {
/* a partir de Matriz de Adyacencia (GM) */
printf("\n");
if (noDirigido) tll=i; else tll=talla;
for (j=0; j<tll; j++) if (GM[i][j]) printf("%d->%d; ",i,j);
}
if (lisDosGraf) {
/* a partir de Listas de Adyacencia (GL) */
printf("\n");
if (noDirigido) printf("\nedge [dir=forward]");
for (i=0; i<talla; i++) {
printf("\n"); a=GL[i];
while (a != NULL) { printf("V%d->V%d; ",i,a->nodo); a=a->sig;}
}
}
printf("\n}\n");

E. Vidal UPV

Pgina 2.20
a


AD3-Grafos-Arboles-2

Octubre, 2000

/* -------------------------------------------------------------------Listado de la matriz adyacencia (por stderr)


*/
if (listaMat) {
fprintf(stderr,"
");
for (i=0;i<talla;i++) fprintf(stderr,"%2d", i);
fprintf(stderr,"\n
"); for (i=0;i<talla;i++) fprintf(stderr," -");
for (i=0; i<talla; i++) {
fprintf(stderr,"\n%2d:",i);
for (j=0; j<talla; j++) fprintf(stderr,"%2d", GM[i][j]);
}
fprintf(stderr,"\n");
}
}

E. Vidal UPV

Pgina 2.21
a


AD3-Grafos-Arboles-2

Octubre, 2000

Ejemplo de ejecucin del programa pruGraph


o
# Ejemplo 1a: Grafo dirigido leido por la entrada standard
>> pruGraf -t 5 -l -d -m
Escribe pares de vrtices separados por comas:
e
0,1 0,2 0,4
1,3 1,4
2,1 2,2 2,3
3,0 3,4
4,1 4,3
digraph G {
size="10,7.5"; rankdir=LR; rotate=90;
0->1; 0->2; 0->4;
1->3; 1->4;
2->1; 2->2; 2->3;
3->0; 3->4;
4->1; 4->3;
V0->V4; V0->V2; V0->V1;
V1->V4; V1->V3;
V2->V3; V2->V2; V2->V1;
V3->V4; V3->V0;
V4->V3; V4->V1;
}
0: 0 1 1 0 1
1: 0 0 0 1 1
2: 0 1 1 1 0
3: 1 0 0 0 1
4: 0 1 0 1 0
E. Vidal UPV

Pgina 2.22
a


AD3-Grafos-Arboles-2

Octubre, 2000

Ejemplo de ejecucin del programa pruGraph (cont.)


o

# Ejemplo 1b: Grafo dirigido leido por la entrada standard:


# Representacin grfica
o
a
V4

>> pruGraf -t 5 -l -d -m | dot -Tps > ejeGr1.ps


Escribe pares de vrtices separados por comas:
e
0,1 0,2 0,4
V0
1,3 1,4
2,1 2,2 2,3
3,0 3,4
4,1 4,3
0:
1:
2:
3:
4:

0
0
0
1
0

1
0
1
0
1

1
0
1
0
0

0
1
1
0
1

1
1
0
1
0

>> gv -landscape -a5 ejeGr1.ps

E. Vidal UPV

V1

V3

V2

1
4

0
2

Pgina 2.23
a


AD3-Grafos-Arboles-2

Octubre, 2000

Ejemplo de ejecucin del programa pruGraph


o
# Ejemplo 2: Grafo No-dirigido generado aleatoriamente
>> pruGraf -t 8 -N -d -m -s 10
digraph G {
size="10,7.5"; rankdir=LR; rotate=90; edge [dir=none]
2->0;
3->0;
4->2;
5->0;
7->2;

V4

2->1;
3->1;
5->1; 5->2;
7->3; 7->4; 7->6;

V2
V0

edge [dir=forward]
V0->V5; V0->V3; V0->V2;
V1->V5; V1->V3; V1->V2;
V2->V7; V2->V5; V2->V4; V2->V1; V2->V0;
V3->V7; V3->V1; V3->V0;
V4->V7; V4->V2;
V5->V2; V5->V1; V5->V0;
V6->V7;
V7->V6; V7->V4; V7->V3; V7->V2;
}
0: 0 0 1 1 0 1 0 0
1: 0 0 1 1 0 1 0 0
2: 1 1 0 0 1 1 0 1
7
3: 1 1 0 0 0 0 0 1
4: 0 0 1 0 0 0 0 1
5: 1 1 1 0 0 0 0 0
6: 0 0 0 0 0 0 0 1
7: 0 0 1 1 1 0 1 0

V7

V6

V5
V1

V3

5
1

4
2

0
3

>> pruGraf -t 8 -N -d -s 10 | dot -Tps > ejeGr2.ps


>> gv -landscape -b5 ejeGr2.ps
E. Vidal UPV

Pgina 2.24
a

También podría gustarte