You are on page 1of 18

*UDIRV ,,

&DUORV'HOJDGR.ORRV
,QJHQLHUtD7HOHPiWLFD
8QLY&DUORV,,,GH0DGULG

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 1

'HILQLFLyQ

❚ 8QJUDIR * 9( FRQVLVWHHQ


❙ XQFRQMXQWR9GHQRGRV YpUWLFHV \
❙ XQFRQMXQWR(GHDULVWDV DUFRV
❚ &DGDDULVWDHVXQSDU YZ FRQYZ∈9
❚ 6LHOSDUHVWiRUGHQDGRWHQHPRVXQ
JUDIRGLULJLGR
❚ 6HSXHGHDVRFLDUDODVDULVWDVXQDWHUFHUD
FRPSRQHQWHFRVWH SHVR

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 2

1
7HUPLQRORJtD

❚ &DPLQRVHFXHQFLDGH D E
YpUWLFHVWDOTXHGRV F DEHGFH
YpUWLFHVFRQVHFXWLYRV
VRQDG\DFHQWHV G H
❚ &DPLQRVLPSOHDTXHO D E
TXHQRWLHQHYpUWLFHV F DEHF
UHSHWLGRV
❚ &LFORFDPLQRVLPSOH G H
H[FHSWRTXHHO~OWLPR D E
YpUWLFHHVHOSULPHUR F DFGD

Copyright © 2001 cdk@it.uc3m.es G H


Java: Grafos / 3

3UREOHPDGHO
FDPLQRPtQLPR

❚ (QFRQWUDUHOFDPLQRPiVFRUWR
GHVGHXQYpUWLFH2DFXDOTXLHURWURYpUWLFH
❚ &RQVLGHUDPRVJUDIRVGLULJLGRV
❚ 9DULDQWHV
❙ 6LQSHVRV ➀
❙ &RQSHVRVSRVLWLYRV {
+
❙ &RQSHVRV SRVLWLYRV\ QHJDWLYRV {
±
❚ &DVRHVSHFLDO
❙ *UDIRV'LULJLGRV$FtFOLFRV
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 4

2

&DPLQRPtQLPRVLQSHVRV

❚ (QFRQWUDUHOFDPLQRPiVFRUWR
PHGLGRSRUHOQ~PHURGHDULVWDV
GHVGHXQYpUWLFH2DFXDOTXLHURWURYpUWLFH
❚ (VWUDWHJLD%~VTXHGDSRUDQFKXUD

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 5


&iOFXORGH'Z

Dv
v
0 Dv+1

origen O w

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 6

3

$OJRULWPR

❚ $YDQ]DUSRUQLYHOHVDSDUWLUGHO2ULJHQ
DVLJQDQGRGLVWDQFLDVVHJ~QVHDYDQ]D
❚ ,QLFLDOPHQWHHV'Z ∞$OYLVLWDUZVH
UHGXFHDOYDORUFRUUHFWR'Z 'Y
❚ 'HVGHFDGDYYLVLWDPRVDWRGRVORVQRGRV
DG\DFHQWHVDY OLVWDGHDG\DFHQFLD 
❚ 'HVSXpVQRVILMDPRVHQRWURQRGRXWDO
TXH'X 'Y\VLQRH[LVWH'X 'Y
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 7


$OJRULWPR
∞1 ∞
2
V0 V1


0 ∞2 ∞
3

origen V2 V3 V4

∞1 ∞
3
V5 V6

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 8

4

,PSOHPHQWDFLyQ

private void sinPesos (int nodoOrig){


int v,w;
Cola q=new ColaVec();
limpiarDatos();
tabla[nodoOrig].dist=0;
q.insertar(new Integer(nodoOrig));
try {...}
catch(DesbordamientoInferior e){}
}
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 9


,PSOHPHQWDFLyQ
while (!q.esVacia()) {
v=((Integer) q.quitarPrimero()).intValue();
ListaIter p=new
ListaEnlazadaIter(tabla[v].ady);
for(;p.estaDentro();p.avanzar()) {
try w=((Arista) p.recuperar()).dest;
if (tabla[w].dist==INFINITO) {
tabla[w].dist=tabla[v].dist+1;
tabla[w].ant=v;
q.insertar(new Integer(w)); } }
}
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 10

5
&DPLQRPtQLPR {
+
FRQSHVRVSRVLWLYRV

❚ (QFRQWUDUHOFDPLQRPiVFRUWR
PHGLGRFRQVXFRVWHWRWDO
GHVGHXQYpUWLFH2DFXDOTXLHURWURYpUWLFH
❚ (OFRVWHGHFDGDDULVWDHVQRQHJDWLYR
❚ (VWUDWHJLD$OJRULWPRGH'LMNVWUD

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 11

{
+
&iOFXORGH'Z

❚ 'Z 'Y FYZ


❚ 'Z SRVLEOHPHQWHVHPRGLILTXHHQYDULDV
RFDVLRQHV
3
v 3
0 8→6

origen O w
2 6
u

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 12

6
{
+
¢&XiOHVHOVLJXLHQWHY"

❚ 8WLOL]DPRVXQDFRODGHSULRULGDG
❚ (QFRQWUDPRVHOVLJXLHQWHY
HOLPLQDQGRUHSHWLGDPHQWH
HOYpUWLFHGHPtQLPDGLVWDQFLD
KDVWDTXHVHREWHQJD
XQYpUWLFHQRYLVLWDGR

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 13

{
+
$OJRULWPR
∞0 ∞
2
2
origen V0 V1
4 1 3 10 3

3 ∞
1 ∞
2 2
V2 V3 V4

5 ∞
986 8 4 ∞
5 6
1
V5 V6

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 14

7
{
+
&DPLQR
class Camino implements Comparable {
int dest;
int coste;
static Camino infNeg=new Camino();
Camino() {this(0);}
Camino(int d) {this(d,0);}
Camino(int d, int c) {dest=d;coste=c;}
public boolean menorQue(Comparable lder) {
return coste<((Camino)lder).coste;}
public int compara (Comparable lder) {
return coste<((Camino)lder).coste ? -1 :
coste>((Camino)lder).coste ? 1 : 0;}
}
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 15

{
+
,PSOHPHQWDFLyQ
private boolean dijkstra(int nodoOrig){
int v,w;
ColaPrioridad cp=
new MonticuloBinario(Camino.infNeg);
Camino vrec; limpiarDatos();
tabla[nodoOrig].dist=0;
cp.insertar(new Camino(nodoOrig,0));
try {...}
catch(DesbordamientoInferior e){};
return true;
}
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 16

8
{
+
,PSOHPHQWDFLyQ
for (int nodosVistos=0;
nodosVistos<numVertices;
nodosVistos++) {
do {if (cp.esVacia()) return true
vrec=(Camino) cp.eliminarMin(); }
try while (tabla[vrec.dest].extra != 0);
v=vrec.dest;
tabla[v].extra=1;
ListaIter p=
new ListaEnlazadaIter(tabla[v].ady); ...

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 17

{
+
,PSOHPHQWDFLyQ
...
for (; p.estaDentro(); p.avanzar()) {
w=((Arista)p.recuperar()).dest;
int cvw=((Arista)p.recuperar()).coste;
if (cvw<0) return false;
try if (tabla[w].dist>tabla[v].dist+cvw){
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v;
cp.insertar(new Camino(w,tabla[w].dist));
}
} }
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 18

9
&DPLQRPtQLPRFRQ {±
SHVRV SRV\ QHJDWLYRV

❚ (QFRQWUDUHOFDPLQRPiVFRUWR
PHGLGRFRQVXFRVWHWRWDO
GHVGHXQYpUWLFH2DFXDOTXLHURWURYpUWLFH
❚ (OFRVWHGHFDGDDULVWDSXHGHVHUSRVLWLYR
RQHJDWLYR

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 19

{
±
&LFORVGHFRVWHQHJDWLYR

V1

(V3, V4): 2 3 -10


(V3, V4, V1, V3, V4): -3 2
V3 V4

‡ £&RVWHQRGHILQLGR
‡ 7DPELpQDIHFWDDQRGRVIXHUDGHOFLFOR

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 20

10
{
±
(MHPSOR

2
V0 V1
4 1 3 -10

2 2
V2 V3 V4

5 8 4 6
1
V5 V6

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 21

{
±
,PSOHPHQWDFLyQ
private boolean negat(int nodoOrig){
int v,w;
Cola q=new ColaVec();
int cvw; limpiarDatos();
tabla[nodoOrig].dist=0;
q.insertar(new Integer(nodoOrig));
tabla[nodoOrig].extra++;
try {...}
catch(DesbordamientoInferior e){};
return true;
}
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 22

11
{
±
,PSOHPHQWDFLyQ
while (!q.esVacia()) {
v=((Integer) q.quitarPrimero()).intValue();

if(tabla[v].extra++>2*numVertices)
return false; //existe ciclo
try
ListaIter p=new
ListaEnlazadaIter(tabla[v].ady);

...

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 23

{
±
,PSOHPHQWDFLyQ
for(;p.estaDentro();p.avanzar()) {
w=((Arista) p.recuperar()).dest;
cvw=((Arista) p.recuperar()).coste;
if (tabla[w].dist>tabla[v].dist+cvw){
tabla[w].dist=tabla[v].dist+cvw;
try tabla[w].ant=v;
if (tabla[w].extra++%2==0) {
q.insertar(new Integer(w)); }
else tabla[w].extra++;
}
}
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 24

12
'$*V

❚ '$* 'LUHFWHG$F\FOLF*UDSK
❚ *'$ *UDIR'LULJLGR$FtFOLFR
❙ *UDIRGLULJLGRVLQFLFORV

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 25

2UGHQWRSROyJLFR

❚ 8QRUGHQWRSROyJLFRRUGHQD
ORVYpUWLFHVGHXQ*'$GHWDOIRUPDTXH
VLKD\XQFDPLQRGHYDZ
ZDSDUHFHGHVSXpV GHYHQHORUGHQ
❚ 8Q*'$WLHQHDOPHQRV
XQ yUGHQ WRSROyJLFR
❚ 8Q*'$SXHGHWHQHU
YDULRV yUGHQHVWRSROyJLFRV
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 26

13
2UGHQWRSROyJLFR

V0

(V1, V0, V3, V2)


V1 V2
(V1, V3, V0, V2)

V3 dos vértices consecutivos


no tienen que ser adyacentes

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 27

2UGHQWRSROyJLFR

❚ 8QJUDIRFRQFLFORV QR VHSXHGH
RUGHQDUWRSROyJLFDPHQWH
❚ 3DUDGRVYpUWLFHVY\ZHQXQFLFOR
KD\XQFDPLQRGHYDZ\XQRGHZDY
V0
(V2, V1) ⊄ (V1, V0, V2)

V1 V2

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 28

14
$OJRULWPR
01 10
grado de
entrada V0 V1

0 3012 012

V2 V3 V4

0123 201

V5 V6

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 29

&DPLQRPtQLPR
{
±
4 6
2
V0 V1
4 1 3 10 4
0 2
2 2
origen V2 V3 V4

5 5 8 4 6 6
1
V5 V6

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 30

15
,PSOHPHQWDFLyQ
private boolean aciclico(int nodoOrig){
int v,w,iteraciones=0;
Cola q=new ColaVec();
limpiarDatos();
tabla[nodoOrig].dist=0;
try { }
catch (DesbordamientoInferior e) {}
return iteraciones==numVertices;
}

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 31

,PSOHPHQWDFLyQ
cálculo de los
for (v=0; v<numVertices; v++) { grados de entrada
ListaIter p=
new ListaEnlazadaIter(tabla[v].ady);
for (; p.estaDentro(); p.avanzar())
tabla[(Arista)p.recuperar()).dest].extra++;}
try

for (v=0; v<numVertices; v++) inserción de


if (tabla[v].extra==0) vértices de
q.insertar(new Integer(v)); grado 0 en
la cola
...

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 32

16
,PSOHPHQWDFLyQ
...

for (iteraciones=0;
!q.esVacia();
iteraciones++) {
try

v=((Integer) q.quitarPrimero()).intValue;
ListaIter p=
new ListaEnlazadaIter(tabla[v].ady);

...

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 33

,PSOHPHQWDFLyQ
...
for (; p.estaDentro(); p.avanzar()) {
w=((Arista)p.recuperar()).dest;
if (--tabla[w].extra==0)
q.insertar(new Integer(w));
try

if (tabla[v].dist==INFINITO) continue;
int cvw=((Arista)p.recuperar()).coste;
if (tabla[w].dist>tabla[v].dist+cvw) {
tabla[w].dist=tabla[v].dist+cvw;
tabla[w].ant=v; }
}
}
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 34

17
$QiOLVLVGH
FDPLQRVFUtWLFRV

❚ *UDIRGHDFWLYLGDGHV
C3 F3
Comienzo
A3 Fin
D2 G2 H1

B2

E1 K4

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 35

$QiOLVLVGH
FDPLQRVFUtWLFRV

❚ *UDIRGHHYHQWRV
C3 0 F3
2 4 7d 7
0 0
A3 0
D2 0 G2 0 10d H1 10
1 6d 6 8d 8
0
B2 0 0
E1 K4
3 5 9

Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 36

18

You might also like