Professional Documents
Culture Documents
Í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
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
vé
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