Professional Documents
Culture Documents
UDIRV,,: &Duorv'Hojdgr - Orrv, Qjhqlhutd7Hohpiwlfd 8Qly&Duorv,,,Gh0Dgulg
UDIRV,,: &Duorv'Hojdgr - Orrv, Qjhqlhutd7Hohpiwlfd 8Qly&Duorv,,,Gh0Dgulg
&DUORV'HOJDGR.ORRV
,QJHQLHUtD7HOHPiWLFD
8QLY&DUORV,,,GH0DGULG
'HILQLFLyQ
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
3UREOHPDGHO
FDPLQRPtQLPR
❚ (QFRQWUDUHOFDPLQRPiVFRUWR
GHVGHXQYpUWLFH2DFXDOTXLHURWURYpUWLFH
❚ &RQVLGHUDPRVJUDIRVGLULJLGRV
❚ 9DULDQWHV
❙ 6LQSHVRV ➀
❙ &RQSHVRVSRVLWLYRV {
+
❙ &RQSHVRVSRVLWLYRV\QHJDWLYRV {
±
❚ &DVRHVSHFLDO
❙ *UDIRV'LULJLGRV$FtFOLFRV
Copyright © 2001 cdk@it.uc3m.es Java: Grafos / 4
2
➀
&DPLQRPtQLPRVLQSHVRV
❚ (QFRQWUDUHOFDPLQRPiVFRUWR
PHGLGRSRUHOQ~PHURGHDULVWDV
GHVGHXQYpUWLFH2DFXDOTXLHURWURYpUWLFH
❚ (VWUDWHJLD%~VTXHGDSRUDQFKXUD
➀
&iOFXORGH'Z
Dv
v
0 Dv+1
origen O w
3
➀
$OJRULWPR
❚ $YDQ]DUSRUQLYHOHVDSDUWLUGHO2ULJHQ
DVLJQDQGRGLVWDQFLDVVHJ~QVHDYDQ]D
❚ ,QLFLDOPHQWHHV'Z ∞$OYLVLWDUZVH
UHGXFHDOYDORUFRUUHFWR'Z 'Y
❚ 'HVGHFDGDYYLVLWDPRVDWRGRVORVQRGRV
DG\DFHQWHVDYOLVWDGHDG\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
4
➀
,PSOHPHQWDFLyQ
➀
,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
{
+
&iOFXORGH'Z
origen O w
2 6
u
6
{
+
¢&XiOHVHOVLJXLHQWHY"
❚ 8WLOL]DPRVXQDFRODGHSULRULGDG
❚ (QFRQWUDPRVHOVLJXLHQWHY
HOLPLQDQGRUHSHWLGDPHQWH
HOYpUWLFHGHPtQLPDGLVWDQFLD
KDVWDTXHVHREWHQJD
XQYpUWLFHQRYLVLWDGR
{
+
$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
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); ...
{
+
,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 {±
SHVRVSRV\QHJDWLYRV
❚ (QFRQWUDUHOFDPLQRPiVFRUWR
PHGLGRFRQVXFRVWHWRWDO
GHVGHXQYpUWLFH2DFXDOTXLHURWURYpUWLFH
❚ (OFRVWHGHFDGDDULVWDSXHGHVHUSRVLWLYR
RQHJDWLYR
{
±
&LFORVGHFRVWHQHJDWLYR
V1
£&RVWHQRGHILQLGR
7DPELpQDIHFWDDQRGRVIXHUDGHOFLFOR
10
{
±
(MHPSOR
2
V0 V1
4 1 3 -10
2 2
V2 V3 V4
5 8 4 6
1
V5 V6
{
±
,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);
...
{
±
,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
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
2UGHQWRSROyJLFR
❚ 8QJUDIRFRQFLFORV QR VHSXHGH
RUGHQDUWRSROyJLFDPHQWH
❚ 3DUDGRVYpUWLFHVY\ZHQXQFLFOR
KD\XQFDPLQRGHYDZ\XQRGHZDY
V0
(V2, V1) ⊄ (V1, V0, V2)
V1 V2
14
$OJRULWPR
01 10
grado de
entrada V0 V1
0 3012 012
V2 V3 V4
0123 201
V5 V6
&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
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;
}
,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
16
,PSOHPHQWDFLyQ
...
for (iteraciones=0;
!q.esVacia();
iteraciones++) {
try
v=((Integer) q.quitarPrimero()).intValue;
ListaIter p=
new ListaEnlazadaIter(tabla[v].ady);
...
,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
$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
18