You are on page 1of 18

*UDIRV

,,

uc3m.QJHQLHUtD7HOHPiWLFD 8QLY&DUORV.. &DUORV'HOJDGR.GH0DGULG Copyright © 2001 cdk@it.ORRV .es Java: Grafos / 1 'HILQLFLyQ ❚ 8QJUDIR * 9(..

FRQVLVWHHQ ❙ XQFRQMXQWR9GHQRGRV YpUWLFHV.

\ ❙ XQFRQMXQWR(GHDULVWDV DUFRV.

❚ &DGDDULVWDHVXQSDU YZ.

FRQYZ∈9 ❚ 6LHOSDUHVWiRUGHQDGRWHQHPRVXQ JUDIRGLULJLGR ❚ 6HSXHGHDVRFLDUDODVDULVWDVXQDWHUFHUD FRPSRQHQWHFRVWH SHVR.

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

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.es G H Java: Grafos / 3 3UREOHPDGHO FDPLQRPtQLPR ❚ (QFRQWUDUHOFDPLQRPiVFRUWR GHVGHXQYpUWLFH2DFXDOTXLHURWURYpUWLFH ❚ &RQVLGHUDPRVJUDIRVGLULJLGRV ❚ 9DULDQWHV ❙ 6LQSHVRV ➀ ❙ &RQSHVRVSRVLWLYRV { + ❙ &RQSHVRV SRVLWLYRV\.uc3m.

es Java: Grafos / 4 2 .uc3m.QHJDWLYRV { ± ❚ &DVRHVSHFLDO ❙ *UDIRV'LULJLGRV$FtFOLFRV Copyright © 2001 cdk@it.

➀ &DPLQRPtQLPRVLQSHVRV ❚ (QFRQWUDUHOFDPLQRPiVFRUWR PHGLGRSRUHOQ~PHURGHDULVWDV.

es Java: Grafos / 5 ➀ &iOFXORGH'Z Dv v 0 Dv+1 origen O w Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 6 3 .uc3m. GHVGHXQYpUWLFH2DFXDOTXLHURWURYpUWLFH ❚ (VWUDWHJLD%~VTXHGDSRUDQFKXUD Copyright © 2001 cdk@it.

➀ $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 / 8 4 .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.

PSOHPHQWDFLyQ private void sinPesos (int nodoOrig){ int v.avanzar()) { try w=((Arista) p. ➀ . q.estaDentro(). if (tabla[w].p.ady).recuperar()).intValue().dist+1.es Java: Grafos / 10 5 ..dist=tabla[v].insertar(new Integer(w)).. ListaIter p=new ListaEnlazadaIter(tabla[v]. for(.dist==INFINITO) { tabla[w].w.dest.uc3m.PSOHPHQWDFLyQ while (!q.dist=0.p.insertar(new Integer(nodoOrig)). try {. tabla[nodoOrig].esVacia()) { v=((Integer) q. q.quitarPrimero()). tabla[w].es Java: Grafos / 9 ➀ .ant=v. Cola q=new ColaVec().} catch(DesbordamientoInferior e){} } Copyright © 2001 cdk@it. limpiarDatos(). } } } Copyright © 2001 cdk@it.uc3m.

&DPLQRPtQLPR { + FRQSHVRVSRVLWLYRV ❚ (QFRQWUDUHOFDPLQRPiVFRUWR PHGLGRFRQVXFRVWHWRWDO.

uc3m. 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.es Java: Grafos / 12 6 .

{ + ¢&XiOHVHOVLJXLHQWHY" ❚ 8WLOL]DPRVXQDFRODGHSULRULGDG ❚ (QFRQWUDPRVHOVLJXLHQWHY HOLPLQDQGRUHSHWLGDPHQWH HOYpUWLFHGHPtQLPDGLVWDQFLD KDVWDTXHVHREWHQJD XQYpUWLFHQRYLVLWDGR Copyright © 2001 cdk@it.es Java: Grafos / 14 7 .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.

insertar(new Camino(nodoOrig. limpiarDatos(). } Copyright © 2001 cdk@it.0)). Camino() {this(0).w.} public int compara (Comparable lder) { return coste<((Camino)lder).0).es Java: Grafos / 15 { + .coste. return true. static Camino infNeg=new Camino().coste ? 1 : 0.} Camino(int d.uc3m.coste=c.} } Copyright © 2001 cdk@it. { + &DPLQR class Camino implements Comparable { int dest. int c) {dest=d.coste ? -1 : coste>((Camino)lder).. try {.infNeg). Camino vrec..} Camino(int d) {this(d. cp.uc3m.PSOHPHQWDFLyQ private boolean dijkstra(int nodoOrig){ int v. ColaPrioridad cp= new MonticuloBinario(Camino.} catch(DesbordamientoInferior e){}.} public boolean menorQue(Comparable lder) { return coste<((Camino)lder). tabla[nodoOrig]. int coste.dist=0.es Java: Grafos / 16 8 .

} try while (tabla[vrec.estaDentro()... } } } Copyright © 2001 cdk@it.dist=tabla[v]. . { + . p.recuperar()). tabla[v].tabla[w]. ListaIter p= new ListaEnlazadaIter(tabla[v]. Copyright © 2001 cdk@it. v=vrec.. cp.es Java: Grafos / 18 9 . for (.dist+cvw.esVacia()) return true vrec=(Camino) cp.es Java: Grafos / 17 { + .ady).dist)). nodosVistos++) { do {if (cp. nodosVistos<numVertices.PSOHPHQWDFLyQ . if (cvw<0) return false.uc3m.ant=v. int cvw=((Arista)p.insertar(new Camino(w.uc3m.coste.extra != 0).avanzar()) { w=((Arista)p.extra=1. p.dest.dest]. tabla[w]. try if (tabla[w].dist+cvw){ tabla[w].eliminarMin().PSOHPHQWDFLyQ for (int nodosVistos=0..dest.recuperar()).dist>tabla[v].

&DPLQRPtQLPRFRQ {± SHVRV SRV\.

QHJDWLYRV ❚ (QFRQWUDUHOFDPLQRPiVFRUWR PHGLGRFRQVXFRVWHWRWDO.

GHVGHXQYpUWLFH2DFXDOTXLHURWURYpUWLFH ❚ (OFRVWHGHFDGDDULVWDSXHGHVHUSRVLWLYR RQHJDWLYR Copyright © 2001 cdk@it. V4): -3 2 V3 V4 ‡ £&RVWHQRGHILQLGR ‡ 7DPELpQDIHFWDDQRGRVIXHUDGHOFLFOR Copyright © 2001 cdk@it. V4. V1.es Java: Grafos / 19 { ± &LFORVGHFRVWHQHJDWLYR V1 (V3.uc3m. V3.uc3m. V4): 2 3 -10 (V3.es Java: Grafos / 20 10 .

insertar(new Integer(nodoOrig)).es Java: Grafos / 21 { ± . try {. } Copyright © 2001 cdk@it. q. tabla[nodoOrig]..uc3m.w. limpiarDatos().} catch(DesbordamientoInferior e){}.uc3m.es Java: Grafos / 22 11 . { ± (MHPSOR 2 V0 V1 4 1 3 -10 2 2 V2 V3 V4 5 8 4 6 1 V5 V6 Copyright © 2001 cdk@it. tabla[nodoOrig]. Cola q=new ColaVec().extra++. return true.PSOHPHQWDFLyQ private boolean negat(int nodoOrig){ int v.dist=0.. int cvw.

.intValue().recuperar()). if(tabla[v].avanzar()) { w=((Arista) p. } else tabla[w].dist=tabla[v].PSOHPHQWDFLyQ for(.ant=v. if (tabla[w].dist+cvw){ tabla[w].PSOHPHQWDFLyQ while (!q.extra++%2==0) { q.extra++. { ± .dist>tabla[v].p.uc3m.uc3m.es Java: Grafos / 23 { ± .ady).quitarPrimero()).estaDentro().extra++>2*numVertices) return false.dist+cvw. try tabla[w]. cvw=((Arista) p. //existe ciclo try ListaIter p=new ListaEnlazadaIter(tabla[v].p.. if (tabla[w].insertar(new Integer(w)). } } Copyright © 2001 cdk@it.coste. .es Java: Grafos / 24 12 . Copyright © 2001 cdk@it.recuperar()).esVacia()) { v=((Integer) q.dest.

es Java: Grafos / 26 13 .'$*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.

V2) V3 dos vértices consecutivos no tienen que ser adyacentes Copyright © 2001 cdk@it. V0. V0.uc3m.es Java: Grafos / 28 14 .uc3m.es Java: Grafos / 27 2UGHQWRSROyJLFR ❚ 8QJUDIRFRQFLFORV QR VHSXHGH RUGHQDUWRSROyJLFDPHQWH ❚ 3DUDGRVYpUWLFHVY\ZHQXQFLFOR KD\XQFDPLQRGHYDZ\XQRGHZDY V0 (V2. V3.2UGHQWRSROyJLFR V0 (V1. V2) V1 V2 (V1. V3. V0. V2) V1 V2 Copyright © 2001 cdk@it. V1) ⊄ (V1.

uc3m.es Java: Grafos / 30 15 .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.$OJRULWPR 01 10 grado de entrada V0 V1 0 3012 012 V2 V3 V4 0123 201 V5 V6 Copyright © 2001 cdk@it.uc3m.

dest].insertar(new Integer(v)).ady). v++) { grados de entrada ListaIter p= new ListaEnlazadaIter(tabla[v]. tabla[nodoOrig]. p.iteraciones=0.PSOHPHQWDFLyQ cálculo de los for (v=0. v<numVertices.PSOHPHQWDFLyQ private boolean aciclico(int nodoOrig){ int v..uc3m. for (.avanzar()) tabla[(Arista)p. v<numVertices. p.recuperar()). try { } catch (DesbordamientoInferior e) {} return iteraciones==numVertices.es Java: Grafos / 31 .uc3m.extra++. .dist=0.estaDentro().} try for (v=0. } Copyright © 2001 cdk@it. limpiarDatos().es Java: Grafos / 32 16 .w.. v++) inserción de if (tabla[v]. Copyright © 2001 cdk@it.extra==0) vértices de q. grado 0 en la cola . Cola q=new ColaVec().

intValue. p. ListaIter p= new ListaEnlazadaIter(tabla[v]..avanzar()) { w=((Arista)p.recuperar()). tabla[w].dist+cvw.. .dist+cvw) { tabla[w]. .PSOHPHQWDFLyQ . p.insertar(new Integer(w)).esVacia().ady).quitarPrimero()).uc3m. iteraciones++) { try v=((Integer) q.. !q.dist>tabla[v]. Copyright © 2001 cdk@it. } } } Copyright © 2001 cdk@it. if (tabla[w].. int cvw=((Arista)p.dist==INFINITO) continue.uc3m.recuperar()).. try if (tabla[v].estaDentro().ant=v. for (iteraciones=0.extra==0) q. if (--tabla[w]..dest. for (.es Java: Grafos / 34 17 .PSOHPHQWDFLyQ .dist=tabla[v].coste.es Java: Grafos / 33 .

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. $QiOLVLVGH FDPLQRVFUtWLFRV ❚ *UDIRGHDFWLYLGDGHV C3 F3 Comienzo A3 Fin D2 G2 H1 B2 E1 K4 Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 36 18 .uc3m.