You are on page 1of 9

Apartado 16.1.

2 Ordenacin topolgica
import TipoCola.*;
import ListaGenerica.*;
// Mtodo que devuelve el grado de entrada del vrtice v.
// Se supone los vrtices numerados de 0 a n-1
pulic static int !rado"ntrada#Gra$o%dcia !& int v' t(ro)s "*ception
+
int cuenta , 0;
$or #int ori!en , 0; ori!en - !.numero.e/ertices#'; ori!en00'
+
i$ #!.ad1acente#ori!en& v'' // arco incidente a v
cuenta00;
2
return cuenta;
2
// Mtodo para otener una ordenaci3n topol3!ica.
// Muestra los vrtices que pasan a $ormar parte de la
// ordenaci3n& 1 se !uardan en T45
pulic static
void ordenTopolo!ica#Gra$o%dcia !& int45T' t(ro)s "*ception
+
int 45arcos6nciden;
int v& )& nvert;
ColaLista cola , ne) ColaLista#';
nvert , !.numero.e/ertices#';
arcos6nciden , ne) int4nvert5;
// !rado de entrada de cada vrtice
$or #v , 0; v - nvert; v00'
arcos6nciden4v] , !rado"ntrada#!& v';
S1stem.out.println#78n 9rdenaci3n topol3!ica 7';
$or #v , 0; v - nvert; v00'
i$ #arcos6nciden4v] ,, 0'
cola.insertar#ne) 6nte!er#v'';
/ertice%d1 45 vs , ne) /ertice%d14nvert5;
vs , !.vertices#';
)(ile #:cola.cola/acia#''
+
6nte!er a;
%rco elemento;
Lista6terador itl;
int ; , 0;
a , #6nte!er'cola.quitar#';
) , a.int/alue#';
S1stem.out.print#7 7 0 vs4)5.toStrin!#'';
T4;005 , );

itl , ne) Lista6terador#!.lista%d1c#)''; // iterador de lista
// decrementa !rado entrada de vrtices ad1acentes
)(ile ##elemento , #%rco'itl.si!uiente#'':, null'
+
v , elemento.!et.estino#';;
arcos6nciden4v5--;
i$ #arcos6nciden4v] ,, 0'
cola.insertar#ne) 6nte!er#v'';
2
2
2
Apartado 16.2.1, Matriz de Caminos: Warshall
pulic static int 4545 matri<Caminos#Gra$oMatri< !' t(ro)s "*ception
+
int n , !.numero.e/ertices#';
int 4545 = , ne) int4n54n5; // matri< de caminos
// Se otiene la matri< inicial> matri< de ad1acencia
$or #int i , 0; i - n; i00'
$or #int ; , 0; ; - n; ;00'
=4i54;5 , !.ad1acente#i&;' ? 1 > 0;
// se otienen& virtualmente& a partir de =
0
& las sucesivas
// matrices =
1
& =
@
& =
A &
...& =
n-1
, =
n
que es la matri< de caminos
$or #int B , 0; B - n; B00'
$or #int i , 0; i - n; i00'
$or #int ; , 0; ; - n; ;00'
=4i54;5 , Mat(.min#=4i54;5 0 =4i54B5 * =4B54;5& 1';
return =;
2
Apartado 16.3, Clase GrafMatPeso
pacBa!e Gra$o;
import ;ava.io.*;
import ;ava.util.*;
pulic class Gra$Mat=eso
+
static int 6CD6C6T9 , 0*DDDD;
int 4545 mat=eso;
int num/erts;
static $inal int ma*/erts , @0;
/ertice 45 verts;

pulic Gra$Mat=eso#int m*'
+
mat=eso , ne) int 4m*54m*5;
verts , ne) /ertice4m*5;
$or #int i , 0; i - m*; i00'
$or #int ; , 0; ; - m*; ;00'
mat=eso4i54;5 , 6CD6C6T9;
num/erts , 0;
2

pulic Gra$Mat=eso#'
+
t(is#ma*/erts';
2
pulic int peso%rco#int va& int v' t(ro)s "*ception
+
return mat=eso4va54v5;
2

pulic int peso%rco#Strin! a& Strin! ' t(ro)s "*ception
+
int va& v;
va , num/ertice#a';
v , num/ertice#';
return mat=eso4va54v5;
2

pulic int numero.e/ertices#'
+
return num/erts;
2

pulic /ertice45 vertices#'
+
return verts;
2
pulic void nuevo/ertice #Strin! nom'
+
oolean esta , num/ertice#nom' E, 0;
i$ #:esta'
+
/ertice v , ne) /ertice#nom';
v.asi!/ert#num/erts';
verts4num/erts005 , v;
2
2

pulic void nuevo%rco#Strin! a& Strin! & int peso'
t(ro)s "*ception
+
int va& v;
va , num/ertice#a';
v , num/ertice#';
i$ #va - 0 FF v - 0'
t(ro) ne) "*ception #7/rtice no e*iste7';
mat=eso4va54v5 , peso;
2
pulic void nuevo%rco#int va& int v& int peso't(ro)s "*ception
+
i$ #va - 0 FF v - 0'
t(ro) ne) "*ception #7/rtice no e*iste7';
mat=eso4va54v5 , peso;
2

pulic oolean ad1acente#Strin! a& Strin! 't(ro)s "*ception
+
int va& v;
va , num/ertice#a';
v , num/ertice#';
i$ #va - 0 FF v - 0'
t(ro) ne) "*ception #7/rtice no e*iste7';
return mat=eso4va54v5 :, 6CD6C6T9;
2
pulic oolean ad1acente#int va& int v't(ro)s "*ception
+
i$ #va - 0 FF v - 0'
t(ro) ne) "*ception #7/rtice no e*iste7';
return mat=eso4va54v5 :, 6CD6C6T9;
2

pulic int num/ertice#Strin! vs'
+
/ertice v , ne) /ertice#vs';
oolean encontrado , $alse;
int i , 0;
$or #; #i - num/erts' GG :encontrado;'
+
encontrado , verts4i5.equals#v';
i$ #:encontrado' i00 ;
2
return #i - num/erts' ? i > -1 ;
2

static void entradaGra$o#Gra$Mat=eso !ra& int n' t(ro)s "*ception
+
Hu$$eredIeader entrada , ne) Hu$$eredIeader#
ne) 6nputStreamIeader#S1stem.in'';
Strin! v& );
int peso;
S1stem.out.println#7Lista de 7 0 n 0 7 vertices7';
$or #int i , 1; i -, n; i00'
+
v , entrada.readLine#';
!ra.nuevo/ertice#v';
2

S1stem.out.println
#7%rcos& pares de vertices separados por un espacio 1 peso& 7
0 7#termina con $in'7';
oolean $in , $alse;
do +
Strin!ToBeni<er r;
r , ne) Strin!ToBeni<er#entrada.readLine#'';
v , r.ne*tToBen#';
i$ #: v.equals6!noreCase#7$in7''
+
Strin! Jpeso;
) , r.ne*tToBen#';
Jpeso , r.ne*tToBen#';
peso , 6nte!er.parse6nt#Jpeso';
!ra.nuevo%rco#v& )& peso';
!ra.nuevo%rco#)& v& peso'; //!ra$o es no diri!ido
2
else $in , true;
2 )(ile #:$in';
2
2
Apartado 16.3.2 (Algoritmo de i!"stra#
pacBa!e Gra$o;
pulic class CaminoMinimo
+
private int 4545 =esos;
private int 45 ultimo;
private int 45 .;
private oolean 45 D;
private int s& n; // vrtice ori!en 1 nKmero de vrtices
pulic CaminoMinimo#Gra$Mat=eso !p& int ori!en'
+
n , !p.numero.e/ertices#';
s , ori!en;
=esos , !p.mat=eso;
ultimo , ne) int 4n5;
. , ne) int 4n5;
D , ne) oolean 4n5;
2
pulic void caminoMinimos#'
+
// valores iniciales
$or #int i , 0; i - n; i00'
+
D4i5 , $alse;
.4i5 , =esos4s54i5;
ultimo4i5 , s;
2
D4s5 , true; .4s5 , 0;
// =asos para marcar los n-1 vrtices
$or #int i , 1; i - n; i00'
+
int v , minimo#'; /* selecciona vrtice no marcado
de menor distancia */
D4v5 , true; // actuali<a distancia de vrtices no marcados
$or #int ) , 1; ) - n; )00'
i$ #:D4)5'
i$ ##.4v5 0 =esos4v54)5' - .4)5'
+
.4)5 , .4v5 0 =esos4v54)5;
ultimo4)5 , v;
2
2
2
private int minimo#'
+
int m* , Gra$Mat=eso.6CD6C6T9;
int v , 1;
$or #int ; , 1; ; - n; ;00'
i$ #:D4;5 GG #.4;5-, m*''
+
m* , .4;5;
v , ;;
2
return v;
2
2
Apartado 16.$.1 (Algoritmo de %lo&d#
pacBa!e Gra$o;
pulic class TodoCaminoMinimo
+
private int 4545 pesos;
private int 4545 tra<a;
private int 4545 d;
private int n; // nKmero de vrtices
pulic TodoCaminoMinimo#Gra$Mat=eso !p'
+
n , !p.numero.e/ertices#';
pesos , !p.mat=eso;
d , ne) int 4n54n5;
tra<a , ne) int 4n54n5;
2
pulic void todosCaminosMinimo#'
+
// matri< inicial es la de pesos.
$or #int i , 0; i - n; i00'
$or #int ; , 0; ; - n; ;00'
+
d4i54;5 , pesos4i54;5;
tra<a4i54;5, -1; // indica que camino mas corto es el arco
2
// Camino mLnimo de un vrtice a si mismo> 0
$or #int i , 0; i - n; i00'
d4i54i5 , 0;
$or #int B , 0; B - n; B00'
$or #int i , 0; i - n; i00'
$or #int ; , 0; ; - n; ;00'
i$ ##d4i54B5 0 d4B54;5' - d4i54;5' // nuevo mLnimo
+
d4i54;5 , d4i54B5 0 d4B54;5;
tra<a4i54;5, B;
2
2
2
Apartado 16.'.2 (Algoritmo de (rim#
pacBa!e Gra$o;
pulic class %rol"*pansionMinimo
+
private int 4545 =esos;
private int n; // vrtice ori!en 1 nKmero de vrtices
pulic %rol"*pansionMinimo#Gra$Mat=eso !p'
+
n , !p.numero.e/ertices#';
=esos , !p.mat=eso;
2
pulic int arol"*pansion=rim#'
+
int lon!Min& menor;
int <;
int 45 coste , ne) int 4n5;
int 45 masCerca , ne) int 4n5;
oolean 45 M , ne) oolean 4n5;
$or #int i , 0; i - n; i00'
M4i5 , $alse; // con;unto vacLo
lon!Min , 0;
M405 , true; //se parte del vrtice 0
// inicialmente& coste4i5 es la arista #0&i'
$or #int i , 1; i - n; i00'
+
coste4i5 , =esos4054i5;
masCerca4i5 , 0;
2
$or #int i , 1; i - n; i00'
+ // usca vrtice < de /-M mas cercano&
// de menor lon!itud de arista& a al!Kn vrtice de M
menor , coste415;
< , 1;
$or #int ; , @; ; - n; ;00'
i$ #coste4;5 - menor'
+
menor , coste4;5;
< , ;;
2
lon!Min 0, menor;
// se escrie el arco incorporado al Nrol de e*pansi3n
S1stem.out.println#7/7 0 masCerca4<5 0 7 -E 7 0 7/7 0 <';
M4<5 , true; // vrtice < se aOade al con;unto M
coste4<5 , Gra$Mat=eso.6CD6C6T9;
// deido a la incorporaci3n de <&
// se a;usta coste45 para el resto de vrtices
$or #int ; , 1; ; - n; ;00'
i$ ##=esos4<54;5 - coste4;5' GG :M4;5'
+
coste4;5 , =esos4<54;5;
masCerca4;5 , <;
2
2
return lon!Min;
2
2