Apartado 15.2.2, Clase GrafoMatriz package Grafo; public class Vertice { String nombre; int numVertice; public Vertice(String Vertice(Strin g x) { nombre = x; numVertice = -1; } public String nomVertice() { return nombre; } public boolean equals(Vertice equals(Vert ice n) { return nombreequals(nnombre); nombreequals (nnombre); } public !oi" asigVert(int asigVert(int n) { numVertice = n; } public String toString() { return nombre # $ ($ # numVertice # $)$; } }
package Grafo; public class Grafo%atri& { int numVerts; static final int maxVerts = '; Vertice * !erts; int ** mat+"; public Grafo%atri&(int mx) { mat+" = ne, int mx*mx*; !erts = ne, Verticemx*; Verticemx*; for (int i = ; i mx; i##) for (int . = ; i mx; i##) mat+"i*.* = ; numVerts = ; } public Grafo%atri&() { t/is(maxVerts); }
public int numero0eVertices() numero0eVerti ces() { return numVerts; } public Vertice* !ertices() { return !erts; } public !oi" nue!oVertice nue!oVertice (String nom) { boolean esta = numVertice(nom) numVertice(nom) = ; if (2esta) { Vertice ! = ne, Vertice(nom); Vertice(nom) ; !asigVert(numVerts); !ertsnumVerts##* !ertsnumVer ts##* = !; } } public !oi" nue!o+rco(String nue!o+rco(St ring a3 String b)t/ro,s 4xception { int !a3 !b; !a = numVertice(a); numVertice(a) ; !b = numVertice(b); numVertice(b) ; if (!a 55 !b ) t/ro, ne, 4xception ($V6rtice no existe$); mat+"!a*!b* mat+"!a*!b * = 1; } public !oi" nue!o+rco(int nue!o+rco(in t !a3 int !b)t/ro,s 4xception { if (!a 55 !b ) t/ro, ne, 4xception ($V6rtice no existe$); mat+"!a*!b* mat+"!a*!b * = 1; } boolean a"7acente(String a"7acente(String a3 String String b)t/ro,s b)t/ro,s 4xception { int !a3 !b; !a = numVertice(a); numVertice(a) ; !b = numVertice(b); numVertice(b) ; if (!a 55 !b ) t/ro, ne, 4xception ($V6rtice no existe$); return mat+"!a*!b* == 1; } boolean a"7acente(int a"7acente(in t !a3 int !b)t/ro,s 4xception { if (!a 55 !b ) t/ro, ne, 4xception ($V6rtice no existe$); return mat+"!a*!b* == 1; } int numVertice(String !s) { Vertice ! = ne, Vertice(!s); boolean encontra"o = false; int i = ; for (; (i numVerts) 88 2encontra"o;) 2encontra"o; ) { encontra"o = !ertsi*equals(!); !ertsi*equals(!); if (2encontra"o) (2encontra"o) i## ; } return (i numVerts) 9 i : -1 ; } }
EJERCICIO 15.1
Dado un grafo no dirigido de n nodos representado representado por por su matriz de adyacencia, escribir una aplicación que realice su entrada en memoria. El grafo se guarda en memoria utilizando la clase Grafo%atri&. Al constructor de la clase se le pasa el número de nodos del grafo. El usuario sólo tiene que introducir los nombres de los vértices, la llamada al método nue!oVertice() crea el vértice y lo asigna a la estructura. A continuación se crean los arcos, para lo cual se leen los pares de vértices, sus nombres, que los forman y se llama al método nue!o+rco() . import .a!aio; import .a!autil; import Grafo; public class 4ntra"aGrafo { public static !oi" main(String args*) { nputStreamea"er >nputStream ea"er (S7stemin)); String !3 ,; tr7 { int n; S7stemoutprintln($?@me S7stemoutp rintln($?@mero ro "e no"os: $); n = >ntegerparse>nt(entra" >ntegerparse>nt(entra"area"Aine( area"Aine()); )); Grafo%atri& gra = ne, Grafo%atri&(n); Grafo%atri&(n );
S7stemoutprintln($Aista "e $ # n # $ !ertices$); for (int i = 1; i = n; i##) { ! = entra"area"Aine(); entra"area"Aine(); granue!oVertice(!); } S7stemoutprintln ($+rcos3 pares "e !ertices separa"os por un espacio$); boolean fin = false; "o { StringBokeni&er StringBokeni &er r; r = ne, StringBokeni&er(entra" StringBokeni&er(entra"area"Aine() area"Aine()); ); ! = rnextBoken(); rnextBoken(); if (2 !equals>gnoreCase($fin$) !equals>gno reCase($fin$)) ) { , = rnextBoken(); rnextBoken( ); granue!o+rco(!3 granue!o+rco(!3 ,); granue!o+rco(,3 granue!o+rco(,3 !); DD al ser grafo no "irigi"o } else fin = true; } ,/ile (2fin); S7stemoutprintln($Vertices "el grafo$); Vertice * !s = ne, Verticen*; !s = gra!ertices(); gra!ertices( ); for (int i = ; i n; i##) S7stemoutprint(!si* S7stemoutprint(!si* # $ $);
} catc/(4xception catc/(4xcept ion e) { S7stemoutprintln($ S7stemoutp rintln($ 4rror en la entra"a "el grafo $); } } }
Apartado 15.3.1, Clase GrafoAdcia package Grafo; import listagenerica; public class Vertice+"7 { String nombre; int numVertice; Aista la"; public Vertice+"7(String Vertice+"7( String x) { nombre = x; numVertice = -1; la" = ne, Aista(); } public boolean equals(Eb.ect equals(Eb.ect ") { Vertice+"7 "os = (Vertice+"7)"; (Vertice+"7)"; return nombreequals("osnombre nombreequal s("osnombre); ); } public !oi" asigVert(int n) { numVertice = n; } public String nomVertice() { return nombre; } public String toString() { return nombre # $ ($ # numVertice # $)$; } } package Grafo; public class +rco { int "estino ; "ouble peso; public +rco(int ") { "estino = "; }
public +rco(int "3 "ouble p) { t/is("); peso = p; } public int get0estino() { return "estino; } public boolean equals(Eb.ect equals(Eb.ec t n) {
+rco a = (+rco)n; return "estino == a"estino; } } package Grafo; import listagenerica; public class Grafo+"cia { int numVerts; staic int maxVerts = '; Vertice+"7 * tabl+"c; public Grafo+"cia(int Grafo+"cia(in t mx) { tabl+"c = ne, Vertice+"7mx*; Vertice+"7m x*; numVerts = ; maxVerts = mx; }
public Grafo+"cia() { t/is(maxVerts); } public int numero0eVertices() numero0eVertices() { return numVerts; } public Vertice+"7* !ertices() { return tabl+"c; } //La operaci! listaAdyc()de"#el"e la lista de ad$ace!cia del "%rtice v. public Aista lista+"7c(int lista+"7c(int !)t/ro,s 4xception { if (! 55 ! = numVerts) t/ro, ne, 4xception($ V6rtice fuera "e rango $); return tabl+"c!*la"; tabl+"c!*la "; } public !oi" nue!oVertice (String nom) { boolean esta = numVertice(nom) numVertice(nom) = ; if (2esta) { Vertice+"7 ! = ne, Vertice+"7(nom); Vertice+"7(nom); !asigVert(numVerts); tabl+"c numVerts##* numVerts##* = !; } }
// numVertice() sca el "%rtice e! la ta&la. 'e"#el"e -1 si !o lo e!c#e!tra( public int numVertice(String numVertice(String nm) { Vertice+"7 ! = ne, Vertice+"7(nm); Vertice+"7(nm); boolean encontra"o = false; int i = ; for (; (i numVerts) 88 2encontra"o; ) {
encontra"o = tabl+"c i*equals(!); i*equals(!); if (2encontra"o) (2encontra"o) i## ; } return (i numVerts) 9 i : -1 ; } public !oi" nue!o+rco(String a3 String b)t/ro,s 4xception { if (2a"7acente(a3 (2a"7acente(a 3 b)) { int !a = numVertice(a); numVertice(a); int !b = numVertice(b); numVertice(b); if (!a 55 !b ) t/ro, ne, 4xception($V6rtice 4xception($ V6rtice no existe$); +rco ab = ne, +rco(!b); tabl+"c!a*la"insertarCabe&aAista(ab); } }
public !oi" borrar+rco(String borrar+rco(St ring a3 String b)t/ro,s 4xception { int !a3 !b; !a = numVertice(a); numVertice(a) ; !b = numVertice(b); numVertice(b) ; if (!a 55 !b ) t/ro, ne, 4xception ($V6rtice no existe$); +rco ab = ne, +rco(!b); tabl+"c!a*la"eliminar(ab); }
boolean a"7acente(String a"7acente(Str ing a3 String b)t/ro,s 4xception { int !a3 !b; !a = numVertice(a); numVertice(a) ; !b = numVertice(b); numVertice(b) ; if (!a 55 !b ) t/ro, ne, 4xception ($V6rtice no existe$); if (tabl+"c!a*la"buscarAi (tabl+"c!a* la"buscarAista(ne, sta(ne, +rco(!b)) 2= null) return true; else return false; }
boolean a"7acente(int a"7acente(int !a3 !a3 int !b)t/ro,s 4xception { if (!a 55 !b ) t/ro, ne, 4xception ($V6rtice no existe$); if (tabl+"c!a*la"buscarAi (tabl+"c!a* la"buscarAista(ne, sta(ne, +rco(!b)) 2= null) return true; else return false; }
}
EJERCICIO 15.2 import .a!aio; import Grafo; public class ComponentesFuertes ComponentesFuertes { static nputStreamea"er(S7ste >nputStreamea"er(S7stemin)); min)); static final int CA+V4 = xffff; xffff; public static !oi" main(String * a)t/ro,s 4xception { int n3 i3 !; Grafo%atri& ga; Grafo%atri& ga>n!erso; S7stemoutprint($?@mero "e !6rtices "el grafo: $); n = >ntegerparse>nt(entra" >ntegerparse>nt(entra"area"Aine( area"Aine()); )); ga = ne, Grafo%atri&(n); Grafo%atri& (n); ga>n!erso = ne, Grafo%atri&(n); Grafo%atri&( n); int *m = ne, int n*; int *"escen"ientes *"escen"ien tes = ne, intn*; int *ascen"ientes *ascen"ientes = ne, intn*; int *bosque = ne, intn*; entra"aGrafo(ga3 entra"aGrafo(ga3 n); grafo>n!erso(ga3 grafo>n!erso(ga3 ga>n!erso3 n); Vertice * !s = ne, Verticen*; !s = ga!ertices(); ga!ertices() ; for (i = ; i n; i##) bosquei* = ; ! = ; DD !6rtice "e parti"a "o { m = ecorreGraforecorrerr ecorreGraforecorrerrof(ga3 of(ga3 !s!*nomVertice()); !s!*nomVertice()); DD se obtiene con.unto "e !6rtices "escen"ientes "escen"iente s for (i = ; i n; i##) { "escen"ientesi* "escen"ientesi* = mi*2= CA+V4 9 1 : ; } DD recorre el grafo in!erso 7 obtiene ascen"ientes ascen"iente s m = ecorreGraforecorrerrof(ga>n!erso3 !s!*nomVertice()); DD se obtiene con.unto "e !6rtices "escen"ientes "escen"iente s for (i = ; i n; i##) { ascen"ientesi* ascen"ientes i* = mi*2= CA+V4 9 1 : ; } S7stemoutprint($HnCom S7stemoutprint($HnComponente ponente conexa { $); for (i = ; i n; i##) { if ("escen"ientesi* ("escen"ientesi* ascen"ientesi* ascen"ientesi* == 1) { S7stemoutprint($ S7stemoutprint($ $ # !si*nomVertice()); !si*nomVertice()); bosquei* = 1; } } S7stemoutprintln($ S7stemoutprintln($ }$); DD !6rtice a partir "el cual se obtiene otra componente ! = to"os+rboles(bosque3n); to"os+rboles(bosque3n); } ,/ile (! 2= -1);
} DD fin del método main static !oi" grafo>n!erso(Grafo%atri& g3 Grafo%atri& x3 int n) t/ro,s 4xception { Vertice * !r = g!ertices(); g!ertices(); for (int i = ; i n; i##) xnue!oVertice(!ri*nomVertice()); for (int i = ; i n; i##) for (int . = ; . n; .##) if (ga"7acente(i3.)) (ga"7acente(i3.)) xnue!o+rco(.3i); xnue!o+rco(.3i); } static int to"os+rboles(int to"os+rboles(int * bosque3 int n) { int i3 ,; , = i = -1; "o { if (bosque##i* == ) , = i; } ,/ile ((i n - 1) 88 (, == -1)); return ,; } static !oi" entra"aGrafo(Grafo%atri& entra"aGrafo (Grafo%atri& gra3 int n) t/ro,s 4xception { String !3 ,; S7stemoutprintln($Aist S7stemoutp rintln($Aista a "e $ # n # $ !ertices$); for (int i = 1; i = n; i##) { ! = entra"area"Aine(); entra"area"Aine(); granue!oVertice(!); }
S7stemoutprintln( $+rcos3 pares "e !6rtices separa"os por un espacio $ # $(termina con fin)$); boolean fin = false; "o { StringBokeni&er StringBokeni &er r; r = ne, StringBokeni&er(entra"a StringBokeni&er(entra"area"Aine() rea"Aine()); ); ! = rnextBoken(); rnextBoken(); if (2 !equals>gnoreCase($fin$ !equals>gno reCase($fin$)) )) { , = rnextBoken(); rnextBoken(); granue!o+rco(!3 granue!o+rco(!3 ,); DDgranue!o+rco(,3 DDgranue!o+rco(,3 !); acti!ar acti!ar si el grafo es no "irigi"o } else fin = true; },/ile (2fin); } }
Apartado 15.) Recorrido de #! *rafo // Recorrido e! a!c+#ra de #! *rafo represe!tado represe!tado por s# atriz atriz de ad$ace!cia public static int*recorrer+nc/ura(Gra int*recorr er+nc/ura(Grafo%atri& fo%atri& g3 String org) t/ro,s 4xception { int ,3 !; int * m; ! = gnumVertice(org); gnumVertice(org); if (! ) t/ro, ne, 4xception($ V6rtice origen no existe$); ColaAista cola = ne, ColaAista(); m = ne, intgnumero0eVertices()*; intgnumero0eVertices()*; DD iniciali&a los !6rtices como no marca"os for (int i = ; i gnumero0eVertices(); i##) mi* = CA+V4; m!* = ; DD !6rtice origen que"a marca"o colainsertar(ne, >nteger(!)); ,/ile (2 colacolaVacia()) { >nteger c,; c, = (>nteger) colaquitar() colaquitar() , = c,intValue(); c,intValue(); S7stemoutprintln($V6rt S7stemoutp rintln($V6rtice ice $ # g!erts,* # $ !isita"o$); DD inserta en la cola los a"7acentes "e , no marca"os for (int u = ; u gnumero0eVertices(); gnumero0eVertices(); u##) if ((gmat+",*u* ((gmat+",* u* == 1) 88 (mu* == CA+V4)) { DD se marca !ertice u con n@mero "e arcos /asta el mu* = m,* #1; colainsertar(ne, colainserta r(ne, >nteger(u)); } } return m; }
// Recorrido e! prof#!didad prof#!didad de #! *rafo represe!tado represe!tado por listas de ad$ace!cia static public
int* recorrerrof(Grafo+"cia recorrerrof (Grafo+"cia g3 String org) t/ro,s 4xception
{ int !3 ,; ilaAista pila = ne, ilaAista(); int * m; m = ne, intgnumero0eVertices( intgnumero0eVertices()*; )*; DD iniciali&a los !6rtices como no marca"os ! = gnumVertice(org); gnumVertice(org); if (! ) t/ro, ne, 4xception($ V6rtice origen no existe$); for (int i = ; i gnumero0eVertices(); gnumero0eVe rtices(); i##) mi* = CA+V4; m!* = ; DD !6rtice origen que"a marca"o pilainsertar(ne, >nteger(!)); ,/ile (2pilapilaVacia()) (2pilapilaVacia()) { >nteger c,;
c, = (>nteger) pilaquitar(); pilaquitar(); , = c,intValue(); c,intValue(); S7stemoutprintln($V6rt S7stemoutp rintln($V6rtice ice $ # gtabl+"c,* # $ !isita"o$); DD inserta en la pila los a"7acentes "e , no marca"os DD recorre la lista con un itera"or Aista>tera"or Aista>tera"or list = ne, Aista>tera"or(gtabl+"c Aista>tera"or(gtabl+"c,*la"); ,*la"); >nteger ck; "o { int k; ck = (>nteger) listsiguiente(); listsiguiente(); if (ck 2= null) { k = ckintValue(); ckintValue(); DD !6rtice a"7acente if (mk* 2= CA+V4) { pilainsertar(ne, pilainserta r(ne, >nteger(k)); mk* = 1; DD !6rtice que"a marca"o } } } ,/ile (ck 2= null); } return m; }
// Recorrido e! prof#!didad prof#!didad de #! *rafo represe!tado represe!tado por s# atriz atriz de ad$ace!cia ad$ace!cia static public
int* recorrerrof(Grafo%atri& recorrerrof (Grafo%atri& g3 String org) t/ro,s 4xception
{ int !3 ,; ilaAista pila = ne, ilaAista(); int * m; m = ne, intgnumero0eVertices( intgnumero0eVertices()*; )*; DD iniciali&a los !6rtices como no marca"os ! = gnumVertice(org); gnumVertice(org); if (! ) t/ro, ne, 4xception($ V6rtice origen no existe$); for (int i = ; i gnumero0eVertices(); gnumero0eVe rtices(); i##) mi* = CA+V4; m!* = ; DD !6rtice origen que"a marca"o pilainsertar(ne, >nteger(!)); ,/ile (2pilapilaVacia()) (2pilapilaVacia()) { >nteger c,; c, = (>nteger) pilaquitar(); pilaquitar(); , = c,intValue(); c,intValue(); S7stemoutprintln($V6rt S7stemoutp rintln($V6rtice ice $ # g!erts,* # $ !isita"o$); DD inserta en la pila los a"7acentes "e , no marca"os for (int u = ; u gnumero0eVertices(); gnumero0eVertices(); u##) DD a"7acente 7 no marca"o if ((gmat+",*u* ((gmat+",* u* == 1) 88 (mu* == CA+V4)) { pilainsertar(ne, pilainserta r(ne, >nteger(u)); mu* = 1; } } return m; } }
Apartado 15.-.2, #!tos de artic#laci! static !oi" puntos+rticulacion( puntos+rticu lacion( Grafo%atri& g3 int !3 int *num3 int paso3 boolean * !isita"o3 int * arista3 int *ba.o) t/ro,s 4xception { !isita"o!* = true; num!* = ##paso; ba.o!* = num!*; DD !alor inicial para cIlculo "e ba.o() for (int , = ; , gnumero0eVertices(); ,##) { if (ga"7acente(!3,)) (ga"7acente( !3,)) DD a"7acente , { if (2!isita"o,*) (2!isita"o,* ) { arista,* = !; DD arista "el Irbol "e expansiJn puntos+rticulacion(g3 puntos+rticulacion(g3 ,3 num3 paso3 !isita"o3 arista3 ba.o); if (ba.o,* = num!*) DD ! cumple la regla K S7stemoutprintln($V6r S7stemoutprintln($V6rtice tice $ # ! # $ es punto "e articulaciJn$); articulaciJn$); ba.o!* = %at/min(ba.o!*3 %at/min(ba. o!*3 ba.o,*); } else if (arista!*2= ,) DD arco /acia atrIs ba.o!* = %at/min(ba.o!*3num,*); } } }