Sei sulla pagina 1di 29

Tema 14 – Grafos y su Implementación en Java

Índice general:
1. Conceptos básicos sobre Grafos
Tema 14 – Grafos y su 2. Representación de un Grafo: Matriz vs Listas de
Implementación en Java Adyacencia
Parte I 3. Representación de un Grafo Ponderado: la clase
Adyacente
4. Representación de un Grafo ponderado y
Germán Moltó etiquetado: La clase
Escuela Técnica Superior de Ingeniería Informática GrafoDEtiquetado.
Universidad Politécnica de Valencia 5. Recorrido en Profundidad (DFS) de un Grafo
6. Recorrido en Amplitud (BFS) de un Grafo

Objetivos supondrá el diseño de las clases


Adyacente,Vertice, GrafoD, GrafoND y
 Estudio de la Representación de una Relación GrafoDEtiquetado (ubicadas en el paquete
Binaria entre los Datos de una Colección grafos de estructurasDeDatos).
mediante la estructura Grafo y algunas de sus 3
aplicaciones más significativas.
 Reutilizar las Estructuras de Datos empleadas
en temas anteriores (Diccionario y Lista con
Punto de Interés) y la implementación de las
operaciones de Recorrido y cálculo de
caminos mínimos sobre él (Modelos Cola y
Cola de Prioridad).
 Implementación en Java de un Grafo, que
Bibliografía  Aho A.V., Hopcroft J.E., Ullman J.E. Estructuras de datos y
Algoritmos. Addison-Wesley, 1988.
 Libro de M.A.Weiss, “Estructuras de Datos en  Capítulo 6 para conceptos sobre Grafos y Grafos
Java” (Adisson- Wesley, 2000). Dirigidos
 Capítulo 14, para conceptos sobre Grafos y Grafos
Dirigidos
 Capítulo 22, apartado 22.2.3 para el algoritmo de
Dijkstra con
Montículos de
Emparejamiento
4
Motivación Grafo Dirigido
 En ocasiones, los elementos de una colección  Un Grafo Dirigido (GD) es un Par G = (V,E)
tienen una relación entre ellos que debe ser  V es un conjunto finito de Vértices (o Nodos o
capturada mediante la Estructura de Datos Puntos)
empleada.  E es un conjunto de Aristas (o Arcos) dirigidas
35
 Arista: Par ordenado de Vértices (u,v)
1
0
V |V| =
6

1 |E| =
E 8
j
e
m
p
l
o
s

p
o
s
i
b
l
e
s
:
 Elementos: et a
Ciudades, c. s
Aeropuertos, 
Computadore  e
s de una Red, R n
Puntos de u t
un Plano, t r
7 8
e ( 5),
ciudad 2 (
es, 4
rutas , 5
aéreas 2 ,
,
) 4
recorri
dos , )
turístic 6
,
os,
(
tareas
a 2 (
realiza , 6
r en un
proyec 4 ,
to, etc. ) 3
, )
5
(
2 }
,
5
)
,

(
4
,
1
)
,
(
4
,
7 8
(sus con
Aristas) números
Reales.
1 V=  También
|
{1,2 es posible
Grafo No Grafo 2 ,3,4,
| definir la
Dirigido 5,6}
Etiquetado 3
E función
E=
y Grafo {(1,
de
 Un Grafo etiquetad
No
Ponderado 2),
o para los
Dirigido Vértices,
 Un Grafo
(GND) es con lo
un Par G = Etiqueta
do es un que
(V,E) podemos
grafo G =
 V es un asignar
conjunto (V,E)
finito de sobre el un
Vértices que se nombre a
 E es un define 4 }
5 (
conjunto una 6
de Aristas función f:
no E  A,
Dirigidas
dónde A
 Arista: es un
Par no conjunto
ordenado cuyas
de Vértices compone
(u,v) =
ntes se
(v,u)
llaman
Etiquetas
.
 Un Grafo
Ponderado
es un Grafo
Etiquetado
7 8
cad a Vértice.

7 8
Relaciones de Incidencia Relaciones de Adyacencia
 Sea G = (V,E) un Grafo Dirigido. Si (u,v) Є E, Sea G = (V,E) un Grafo. Si (u,v) Є E, decimos
decimos que Incide Desde u (sale de ..) e que el
Incide En v (llega a ..) Vértice v es Adyacente al Vértice u
• (2, 2) Є E,
• 1
incide desde •
2 e incide en 2

2 3

2
• (1, 2) Є
E, incide
desde 1 e
incide en 2
• (2, 4) Є E, • 4
incide desde 2 4
e incide en 4
5
• (2, 5) Є E,
incide desde 2 6
e incide en 5
• En un Grafo no
• Sea G = (V,E)
Dirigido la relación es
un Grafo no
simétrica:
Dirigido. Si (u,v)
Є E, decimos que
Incide Sobre
uyv
1 3
1 • Ejemplo con el
• (1,2) Є E, ó
(2,1) incide sobre Vértice 3
1 y 2, ó 2 y 1 • 3 es
Adyacente
a6
• (2,5) Є E, ó (5,2) 4 • 6 es
incide sobre 2 y 5, ó Adyacente a
5y2 3
4 5 6

9
10

11 12
La Longitud k Aristas del
del Camino … Camino
 sin pesos es  Si hay un
Grado de Caminos el número de Camino P desde
un Vértice sobre Grafos Aristas u hasta u’,
 con pesos es decimos que u’
 El Grado de Un Camino la suma de los es
un Vértice de longitud k Pesos de las
en un Grafo desde u a u’ en  1 al za
c bl
no Dirigido un grafo El
e
es el número Gr a
G=(V,E) es ad n
de
de Aristas una sd
o z e
que Inciden secuencia de de
a 1
l
sobre él Vértices Ve bl vía
(Vértices <v0,v1,..,vk> rti e <1
,2,
tal que: ce d 5>
Ady 1  v0 = u y 2 es
ace es d
vk = u’ 5
nte e
s).  i : 
Gr u
 El 1..k : (vi- ad ví
Grad 1,vi) Є E o a
o de de P
En
2 es tra

2 da
Ej
4 Salida) de e
 El número 2 m
5
de Aristas que es pl
6 2 os
entran en él
 El Grado de (Grado de  :
Gr
ad 
un Vértice en Entrada) o 5
un Grafo  Ejemplos: de
Sa
Dirigido es la lid
a
e
s
suma de: de
a
2
 El número de es l
3
Aristas que c
salen de él a
n
(Grado de
11 12
1
 4
 El Grado 5 5
de un Grafo es 6
es el de su alc
Vértice de an
máximo za
ble
Grado. de
sd
e
1
vía
<1
,2,
2,
2,
5>

11 12
Representación de un Grafo: Matriz de
Caminos Simples y Ciclos Adyacencia

 Un Camino es Simple si todos sus Vértices Un Grafo G=(V,E) se puede representar con
intermedios son distintos. Si los extremos son una Matriz de |V|x|V| boolean. Si (u,v) Є E,
iguales es un Ciclo. G[u][v] = true; sino
 Un Bucle G[
es un ciclo 3
de longitud 1 u]
4
 En un
[v
]
Grafo
=
Dirigido un fa
Camino ls
<v0,v1,..,vk> e.
forma un 
false true false false false false
Ciclo si: Me
false true falsemo
true true false
 v0 = vk
 el Camino
false false false ria
false false false
contiene al true :
false false false true false
menos una O(|
false false false true false false
Arista V|
false false true2) false false false
 Un Grafo
0
Dirigido es

Acíclico si Tie
no contiene mp
Ciclos o
(GDA) de
ac
ce
so:
O(
1)
1
2
0
1
2

15 16
0 1 2 3 4 5 adyacentes de
Un Ciclo 1 3 4 Representació
 un vértice?
en este 5 n de un Grafo:
5
Grafo es
2
Listas de
<1, 2, 5, Esta
4, 1>, de
 Adyacencia
longitud representación
3
4. consume  Un Grafo
 El bastante Dirigido
camino 4 memoria. G=(V,E) se
<2,2> es suele
un bucle. representar
  Útil para
con un array
Concepto Grafos
de |V| Listas
s Densos (con de Vértices:
similares muchas G[v] es una
para los aristas). Lista de los
Vértices
Grafos No 14
Adyacentes
Dirigidos. a v (v Є V).
13
 Memoria: O(|
V|+|E|)
 Tiempo de
acceso:
Cuestio saber si el O(Grado de
grafo tiene salida de G)
nes 5. ¿Cómo a
bucles? 1
Rápidas sería la 2
2. ¿Cómo matriz de
: 1 |X
saber el adyacencia 2 2
Represe número de de un grafo 3 2|
ntación vértices? no
3. ¿Cómo dirigido? 4|
con
saber si hay 6. ¿Cómo 3
Matriz algún vértice represent X
de sin ar un
Adyace adyacentes? Grafo
ncia 4. ¿Cómo con
calcular el aristas
1. ¿Cómo número de ponderad
15 16
5 |X
4 1 5 |X
4 5 6
5
4
6
3

15 16
Representación de un Grafo: Listas de
Adyacencia Propuesta de Implementación de Grafos
 Un Grafo No Dirigido G=(V,E) se Grafo: Contiene los
representa con un métodos
array de | com
V| Listas unes
de a
Vértices: cual
G[v] es quie
una Lista r
de los impl
Vértices eme
Adyacent ntaci
es a v (v Є
ón
V)

de
Memoria: un
O(|V|+2*| Graf
E|) o.
 Tiempo 
de acceso: Gra
O(Grado de
foD
G)
:
Gra
fo
diri
gid
o
con
aris
tas
pon
der
ada
s.
19 20
1 5  GrafoND:
2| Grafo no
1 dirigido
con
aristas
ponder
adas

19 20
3 GrafoDEtiqueta d
3
 5 2 o Grafo
| DEtiq
dir
2 4 3 uetad igi
4 |X o do
1| 5 4 co
3
| n
5| 4 2
|
ari
5 st
4| 1
|
as
2 po
| nd
er
ad
as
y

rti
ce
s
eti
qu
et
ad
os.

17
18

La clase
S
Java Grafo o
(I) b
r

19 20
e s, etc. La clase g

l
package Java Grafo r
librerias.estruct e
a urasDeDatos.gr (II) s
afos; public abstract
public abstract =
c void
class Grafo { insertarArista(int
l public Grafo() { i, int j);
"
a "
... } public
s public abstract abstr ;
e int act fo
numVertices(); void r
G public abstract inser
int tarAr
r numAristas();
(
ista(i i
a
nt i, n
f
int j, t
o doubl
: e p); i
 Su public
implem abstr =
entació act
Lista 1
n irá
ConPI
crecien <Ady ;
do acent
confor e> i
me adya
veamo cent <
s esDe =
método (int i);
public n
s de
String u
recorri toStr m
do, ing() V
cálculo { e
de S r
camino t t
r
s i
i
mínimo n c
19 20
e s res += for (l.inicio();
s t (l.esVacia()) !l.esFin() ;
( a ? " sin l.siguiente())
Adyacentes res +=
) C " : " con l.recuperar()
o Adyacentes: + " ";
; n "; res += "\n";
P pub I
m
i I lic pl
abs e
+ < m
+ A trac e
t n
) d ta
boo el
y lea m
{ a é
n t
c exi o
d
r e ste o
e n Ari t
o
s t sta S
(int t
e
i, r
+ > int
i
n
= j); g
l .
pu S
" blic a
l
V = abs i
é tra d
ct a
r a :
t d do V
ubl ér
i y
e ti
c a pe c
e
e c so 1
: e Ari c
o
n sta n
" t (int a
e i, d
y
int
+ s a
j); c
D e
i e n
te
; ( s
i 2
3
L ) V
i ; ér
ti
19 20
ce 2
sin
ady
ace
nte
s

19 20
Implementación de un Grafo Dirigido
La clase Java Adyacente Ponderado: La Clase GrafoD
package librerias.estructurasDeDatos.grafos;  GrafoD representa un Grafo
class  de Vértices sin Etiquetar
Adyacente  de Aristas con Pesos,Tripletes de int (origen,
{ int destino, coste)
destino;
 Mediante Listas de Adyacencia (array de |V|
double peso; ListaConPI
Adyacente(int codAdy, double p){
de Adyacentes)
destino=codAdy; peso = p; } public 2
String
toString( 1 (5
){ return (2,3) ,7
destino + |X )
“(”+ peso |X
+ “)”; } 3
} 2
(2,2) |
(4,8) |
1 (3,7) |X
2
 La clase 3
Adyacente no (
7
se hace pública 1
puesto que
8 ,
únicamente se
utilizará dentro 7
del paquete )
7
grafos (acceso
friendly
únicamente |
7
para el resto
de clases del 3 X (
paquete). 3
4
,
4 3
21
3
)

5
|
6
X
22
(
5
L
p
a u
b
l
c i
nPI<Adyace
La nte> l c
clase elArray[];
a i
Java
Grafo s n
t
D (I) e
package n
librerias. u
estructur J m
asDeDato V
s.grafos; a e
import
librerias.e
v r
t
structuras a i
DeDatos.
c
modelos.L
e
istaConPI;
import
G s
(
librerias.e r
structuras )
DeDatos.l a
{
ineales.LE f
GListaCon
PI; public o r
class e
GrafoD
D t
extends u
Grafo { r
protect ( n
ed int
numV,
I
n
numA; I u
protect
m
ed )
ListaCo V
; A e
} ; i c
u
n
p
p } t e
u r
b p j a
l u ) r
(
i b
)
c l { .
i ListaCon d
i c PI<Adya e
cente> s
n l= t
t b elArray[i i
o ]; n
n o boolean o
esta=fal =
u l se; =
m e for j
A a (l.inicio( )
r n ); !
i l.esFin() e
&& ! s
s e esta; t
t x l.siguien a
a i te())
s s i =
( t f t
r
) e
( u
A l e
{ r . ;
i r return esta;
r s @Suppres n s; numA=0;
e t sWarnin u
t a gs("unc m
u ( hecked" V
r i ) public e
n n GrafoD r
t (int t
n numVer i
u i tices){ c
m , numV = e
Por
} { i<=numV; i+ for (l.inicio(); !
convenio, los
vértices se pu +)elArray[i]= l.esFin();
numeran newLEGListaCon l.siguiente())
b L
desde 1..N y PI<Adyacente>() if
se l i ;
almacenan (l.recuperar().d
i s }
en las estino==j)
posiciones c t return
1..N del a l.recuperar().p
array. 23
d C eso;
o o return 0.0;
u n }
b P 24
l I
e <
A
p d
e y
s a
o c
A e
r n
i t
s e
t >
a
( l
i
n =
t
e
i l
, A
r
i r
n a
t y
[
j i
) ]
;
elArray = new Vertices+1];
ListaConPI[num for (int i=1;
La clase Java GrafoD (III) Prueba de la clase GrafoD
public void insertarArista(int i, int j) { public static void main(String
insertarArista(i,j,1); args[]){ GrafoD g = new
} 3
GrafoD(6); 1 2 3
g.insertarArista(1, 2, 3); 9 5
8
public void insertarArista(int i, int j, double p) { g.insertarArista(1, 5, 8);
S
if ( !existeArista(i,j) ) { elArray[i].insertar(new g.insertarArista(2, 5, 9);
Adyacente(j,p)); numA++; } g.insertarArista(3, 6, 5); p
} System.out.println(“El grafo es: u
"+g.toString());
}
y os con
Imple 4 (
ac ad Etiqu (v4
)
mentac
e ya etas (
ión de 2
nt ce
Grafo (dato
es nt
Dirigid de
D es
o tipo
e( al
Ponder objeto
1) vé ), i.e.
ado
; rti Pares
con
Sy ce (etiq
Vértice
st 1 ueta
s /dat
e so
Etiquet o,
m. n:
ados: nº
ou ");
Clase vérti
t. for (l.inicio(); !
l.esFin(); GrafoD ce)
pri
l.siguiente()) { Etiquet  de
ntl
System.out.println ado Arista
n( (“(1, " +
“L l.recuperar().desti s con
no + ")");  La Peso
clase s
} Grafo 
25 DEtiqu Median
26
etado te
repres Listas
enta de
un Adyace
ncia
Grafo
public class (array
La clase GrafoND extends  de de |V|
GrafoD { Vértic ListaCo
Java public es nPI
GrafoND GrafoND(int public
void
s d 1 v
numVertices) { insert t 2
package super(numVertic arAris )
2 (
librerias.estructur es); } ta(int
asDeDatos.grafos i, int j, 3 v 3
int p) v2 1
; {
¿Cómo se implementaría 8 ) (
import el método
if (
librerias.estructur insertarArista? v
! 2
3
asDeDatos.model
e )
os.ListaConPI; (
xi x
n 7 ( (5,3) |
u
} 1 X
v
( ,
6 7
v
)
5
|
(
4
,
3
)

|
X
}
(3,7) |X
2
7
Correspondencia entre Etiquetas de
Vértice y su Código La clase Java GrafoDEtiquetado (I)
package librerias.estructurasDeDatos.grafos;
 El constructor del Grafo especifica los vértices de
los que va a constar el grafo. import librerias.estructurasDeDatos.modelos.*;
 Los vértices ya existen al crear el Grafo (aunque sin import
etiquetar). librerias.estructurasDeDatos.hash.TablaHashDiccionario;
import librerias.excepciones.ElementoNoEncontrado;
 Para etiquetar un vértice, se utiliza el método:
 public void etiquetarVertice(int codigo, E etiqueta) import java.util.ArrayList;
 Para obtener el código de un vértice a partir de public class GrafoDEtiquetado<E> extends
su etiqueta, utilizamos un GrafoD{ E etiquetas[];
Diccionario<E,Integer>. Diccionario<E, Integer> dicVertices;
@SuppressWarnings("unchecked")
Índice Nombre D 1 public
C L GrafoDEtique
i2
10 tado(int
A 3 numVertices) {
B 4 super(numV
12 ertices);
6
D etiquetas =
B (E[]) new
23 Object[numV
A ertices+1];
D
dicVertices =
87
new
E
TablaHashDi
D
ccionario<E,
43
Integer>(nu
2 mVertices);
9
}
30

La clase public boolean


existeArista(E
Java i, E j) {
GrafoDE return
existeArista
tiquetad (obtenerCo
o (II) digo(i),
obtenerC t r
odigo(j)); La clase
a t
} Java ) i
public double
pesoArista(E
GrafoDEti c
{ e
i, E j) { quetado
return s
pesoArist
(III) e .i
a(obtener public t n
Codigo(i),
v i s
obtenerC
odigo(j)); oi q e
} d u r
public void e e t
insertarArist ti t a
a(E i, E j) { q a r
insertarAr u s (
ista(obte
nerCodig e [ e
o(i), t c t
obtenerC a o i
odigo(j)); r d q
} i u
V
public void
e g e
insertarAris
ta(E i, E j, r o t
double p) { ti ] a
insertarAris c ,
ta(obtener e = c
Codigo(i),
(i o
obtenerCo
digo(j), p); n e d
} t t i
public c i g
ListaConPI<A o q o
dyacente> d u )
adyacentes
De(E i) { i e ;
return g t }
adyacent o a public E
esDe(obt , ; obtenerEtique
enerCodi
E ta(int codigo) {
go(i)); return
e d
} etiquetas[c
ti i
31 odigo];
q c
}
u V
public int
e e obtenerCodigo
(E etiqueta) { r
int (
codigo; e
try { t
i
c q
o u
d e
i t
g a
o )
.
= i
n
d t
i V
c a
V l
e u
r e
t (
i )
c ;
e
s } catch
. (ElementoN
r oEncontrado
e e) { codigo
c = -1; }
u return
p codigo;
e }
r 32
a
Prueba de la clase GrafoDEtiquetado
public static void main(String args[]){
GrafoDEtiquetado<Persona> g = new
GrafoDEtiquetado<Persona>(3); Persona jane = new
Persona("1123F","Jane Doe",25);
Persona john = new Persona("5656M","John Doe",46);
Persona paul = new Persona("8372G", "Paul Paul
Carlson", 21); (3)
g.etiquetarVertice(1,jan John
e); 7 3
g.etiquetarVertice(2,joh
10 Jane
n); (1)
g.etiquetarVertice(3,paul
); g.insertarArista(jane,
john, 10);
g.insertarArista(jane,
paul, 7);
g.insertarArista(paul,
jane, 3);
System.out.println("Grafo: Grafo de afinidad ([0..10]) que siente
una persona hacia las de su red social.
" + g);
}
33