You are on page 1of 12

Apartado 15.2.

2, Clase GrafoMatriz
package Grafo;
public class Vertice
{
String nombre;
int numVertice;
public Vertice(String x)
{
nombre = x;
numVertice = -1;
}
public String nomVertice()
{
return nombre;
}
public boolean equals(Vertice n)
{
return nombreequals(nnombre);
}
public !oi" 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, Vertice)mx*;
for (int i = (; i - mx; i##)
for (int . = (; i - mx; i##)
mat+")i*).* = (;
numVerts = (;
}

public Grafo%atri&()
{
t/is(maxVerts);
}
public int numero0eVertices()
{
return numVerts;
}
public Vertice)* !ertices()
{
return !erts;
}
public !oi" nue!oVertice (String nom)
{
boolean esta = numVertice(nom) 1= (;
if (2esta)
{
Vertice ! = ne, Vertice(nom);
!asigVert(numVerts);
!erts)numVerts##* = !;
}
}
public !oi" nue!o+rco(String a3 String b)t/ro,s 4xception
{
int !a3 !b;
!a = numVertice(a);
!b = numVertice(b);
if (!a - ( 55 !b - () t/ro, ne, 4xception ($V6rtice no existe$);
mat+")!a*)!b* = 1;
}
public !oi" nue!o+rco(int !a3 int !b)t/ro,s 4xception
{
if (!a - ( 55 !b - () t/ro, ne, 4xception ($V6rtice no existe$);
mat+")!a*)!b* = 1;
}
boolean a"7acente(String a3 String b)t/ro,s 4xception
{
int !a3 !b;
!a = numVertice(a);
!b = numVertice(b);
if (!a - ( 55 !b - () t/ro, ne, 4xception ($V6rtice no existe$);
return mat+")!a*)!b* == 1;
}
boolean a"7acente(int !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;)
{
encontra"o = !erts)i*equals(!);
if (2encontra"o) i## ;
}
return (i - numVerts) 9 i : -1 ;
}
}
EJERCICIO 15.1
Dado un grafo no dirigido de n nodos representado por su matriz de adyacencia,
escribir una aplicacin 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 nmero de nodos del grafo. El usuario slo tiene que introducir los
nombres de los vrtices, la llamada al mtodo nue!oVertice() crea el vrtice y lo
asigna a la estructura. A continuacin se crean los arcos, para lo cual se leen los pares de
vrtices, sus nombres, que los forman y se llama al mtodo nue!o+rco().
import .a!aio;;
import .a!autil;;
import Grafo;;
public class 4ntra"aGrafo
{
public static !oi" main(String args)*)
{
<uffere"=ea"er entra"a = ne, <uffere"=ea"er (
ne, >nputStream=ea"er (S7stemin));
String !3 ,;
tr7 {
int n;
S7stemoutprintln($?@mero "e no"os: $);
n = >ntegerparse>nt(entra"area"Aine());
Grafo%atri& gra = ne, Grafo%atri&(n);

S7stemoutprintln($Aista "e $ # n # $ !ertices$);
for (int i = 1; i -= n; i##)
{
! = entra"area"Aine();
granue!oVertice(!);
}

S7stemoutprintln
($+rcos3 pares "e !ertices separa"os por un espacio$);
boolean fin = false;
"o {
StringBokeni&er r;
r = ne, StringBokeni&er(entra"area"Aine());
! = rnextBoken();
if (2 !equals>gnoreCase($fin$))
{
, = rnextBoken();
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, Vertice)n*;
!s = gra!ertices();
for (int i = (; i - n; i##)
S7stemoutprint(!s)i* # $ $);

}
catc/(4xception e)
{
S7stemoutprintln($ 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 x)
{
nombre = x;
numVertice = -1;
la" = ne, Aista();
}
public boolean equals(Eb.ect ")
{
Vertice+"7 "os = (Vertice+"7)";
return nombreequals("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 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 mx)
{
tabl+"c = ne, Vertice+"7)mx*;
numVerts = (;
maxVerts = mx;
}
public Grafo+"cia()
{
t/is(maxVerts);
}

public int 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 !)t/ro,s 4xception
{
if (! - ( 55 ! 1= numVerts)
t/ro, ne, 4xception($ V6rtice fuera "e rango $);
return tabl+"c)!*la";
}
public !oi" nue!oVertice (String nom)
{
boolean esta = numVertice(nom) 1= (;
if (2esta)
{
Vertice+"7 ! = ne, Vertice+"7(nom);
!asigVert(numVerts);
tabl+"c )numVerts##* = !;
}
}
// numVertice()&#sca el "%rtice e! la ta&la. 'e"#el"e -1 si !o lo e!c#e!tra(
public int numVertice(String nm)
{
Vertice+"7 ! = ne, Vertice+"7(nm);
boolean encontra"o = false;
int i = (;
for (; (i - numVerts) 88 2encontra"o; )
{
encontra"o = tabl+"c )i*equals(!);
if (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 b))
{
int !a = numVertice(a);
int !b = numVertice(b);
if (!a - ( 55 !b - ()
t/ro, ne, 4xception($V6rtice no existe$);
+rco ab = ne, +rco(!b);
tabl+"c)!a*la"insertarCabe&aAista(ab);
}
}
public !oi" borrar+rco(String a3 String b)t/ro,s 4xception
{
int !a3 !b;
!a = numVertice(a);
!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 a3 String b)t/ro,s 4xception
{
int !a3 !b;
!a = numVertice(a);
!b = numVertice(b);
if (!a - ( 55 !b - () t/ro, ne, 4xception ($V6rtice no existe$);
if (tabl+"c)!a*la"buscarAista(ne, +rco(!b)) 2= null)
return true;
else
return false;
}
boolean a"7acente(int !a3 int !b)t/ro,s 4xception
{
if (!a - ( 55 !b - () t/ro, ne, 4xception ($V6rtice no existe$);
if (tabl+"c)!a*la"buscarAista(ne, +rco(!b)) 2= null)
return true;
else
return false;
}
}

EJERCICIO 15.2
import .a!aio;;
import Grafo;;
public class ComponentesFuertes
{
static <uffere"=ea"er entra"a = ne, <uffere"=ea"er(
ne, >nputStream=ea"er(S7stemin));
static final int CA+V4 = (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"area"Aine());
ga = ne, Grafo%atri&(n);
ga>n!erso = ne, Grafo%atri&(n);
int )*m = ne, int )n*;
int )*"escen"ientes = ne, int)n*;
int )*ascen"ientes = ne, int)n*;
int )*bosque = ne, int)n*;

entra"aGrafo(ga3 n);
grafo>n!erso(ga3 ga>n!erso3 n);
Vertice )* !s = ne, Vertice)n*;
!s = ga!ertices();
for (i = (; i - n; i##)
bosque)i* = (;
! = (; DD !6rtice "e parti"a
"o {
m = =ecorreGraforecorrerGrof(ga3 !s)!*nomVertice());
DD se obtiene con.unto "e !6rtices "escen"ientes
for (i = (; i - n; i##)
{
"escen"ientes)i* = m)i*2= CA+V4 9 1 : (;
}
DD recorre el grafo in!erso 7 obtiene ascen"ientes
m = =ecorreGraforecorrerGrof(ga>n!erso3 !s)!*nomVertice());
DD se obtiene con.unto "e !6rtices "escen"ientes
for (i = (; i - n; i##)
{
ascen"ientes)i* = m)i*2= CA+V4 9 1 : (;
}
S7stemoutprint($HnComponente conexa { $);
for (i = (; i - n; i##)
{
if ("escen"ientes)i* ; ascen"ientes)i* == 1)
{
S7stemoutprint($ $ # !s)i*nomVertice());
bosque)i* = 1;
}
}
S7stemoutprintln($ }$);
DD !6rtice a partir "el cual se obtiene otra componente
! = to"os+rboles(bosque3n);
} ,/ile (! 2= -1);
} DD fin del mtodo main
static !oi"
grafo>n!erso(Grafo%atri& g3 Grafo%atri& x3 int n) t/ro,s 4xception
{
Vertice )* !r = g!ertices();
for (int i = (; i - n; i##)
xnue!oVertice(!r)i*nomVertice());
for (int i = (; i - n; i##)
for (int . = (; . - n; .##)
if (ga"7acente(i3.)) xnue!o+rco(.3i);
}
static 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& gra3 int n)
t/ro,s 4xception
{
String !3 ,;
S7stemoutprintln($Aista "e $ # n # $ !ertices$);
for (int i = 1; i -= n; i##)
{
! = entra"area"Aine();
granue!oVertice(!);
}

S7stemoutprintln(
$+rcos3 pares "e !6rtices separa"os por un espacio $ #
$(termina con fin)$);
boolean fin = false;
"o {
StringBokeni&er r;
r = ne, StringBokeni&er(entra"area"Aine());
! = rnextBoken();
if (2 !equals>gnoreCase($fin$))
{
, = rnextBoken();
granue!o+rco(!3 ,);
DDgranue!o+rco(,3 !); 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 por s# ,atriz de ad$ace!cia
public static
int)*recorrer+nc/ura(Grafo%atri& g3 String org) t/ro,s 4xception
{
int ,3 !;
int )* m;
! = gnumVertice(org);
if (! - () t/ro, ne, 4xception($ V6rtice origen no existe$);
ColaAista cola = ne, ColaAista();
m = ne, int)gnumero0eVertices()*;
DD iniciali&a los !6rtices como no marca"os
for (int i = (; i - gnumero0eVertices(); i##)
m)i* = CA+V4;
m)!* = (; DD !6rtice origen que"a marca"o

colainsertar(ne, >nteger(!));
,/ile (2 colacolaVacia())
{
>nteger c,;
c, = (>nteger) colaquitar()
, = c,intValue();
S7stemoutprintln($V6rtice $ # g!erts),* # $ !isita"o$);
DD inserta en la cola los a"7acentes "e , no marca"os
for (int u = (; u - gnumero0eVertices(); u##)
if ((gmat+"),*)u* == 1) 88 (m)u* == CA+V4))
{
DD se marca !ertice u con n@mero "e arcos /asta el
m)u* = m),* #1;
colainsertar(ne, >nteger(u));
}
}
return m;
}
// Recorrido e! prof#!didad de #! *rafo represe!tado por listas de ad$ace!cia

static
public int)* recorrerGrof(Grafo+"cia g3 String org)
t/ro,s 4xception
{
int !3 ,;
GilaAista pila = ne, GilaAista();
int )* m;
m = ne, int)gnumero0eVertices()*;
DD iniciali&a los !6rtices como no marca"os
! = gnumVertice(org);
if (! - () t/ro, ne, 4xception($ V6rtice origen no existe$);
for (int i = (; i - gnumero0eVertices(); i##)
m)i* = CA+V4;
m)!* = (; DD !6rtice origen que"a marca"o
pilainsertar(ne, >nteger(!));
,/ile (2pilapilaVacia())
{
>nteger c,;
c, = (>nteger) pilaquitar();
, = c,intValue();
S7stemoutprintln($V6rtice $ # 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 list = ne, Aista>tera"or(gtabl+"c),*la");
>nteger ck;
"o
{
int k;
ck = (>nteger) listsiguiente();
if (ck 2= null)
{
k = ckintValue(); DD !6rtice a"7acente
if (m)k* 2= CA+V4)
{
pilainsertar(ne, >nteger(k));
m)k* = 1; DD !6rtice que"a marca"o
}
}
} ,/ile (ck 2= null);
}
return m;
}
// Recorrido e! prof#!didad de #! *rafo represe!tado por s# ,atriz de ad$ace!cia
static
public int)* recorrerGrof(Grafo%atri& g3 String org)
t/ro,s 4xception
{
int !3 ,;
GilaAista pila = ne, GilaAista();
int )* m;
m = ne, int)gnumero0eVertices()*;
DD iniciali&a los !6rtices como no marca"os
! = gnumVertice(org);
if (! - () t/ro, ne, 4xception($ V6rtice origen no existe$);
for (int i = (; i - gnumero0eVertices(); i##)
m)i* = CA+V4;
m)!* = (; DD !6rtice origen que"a marca"o
pilainsertar(ne, >nteger(!));
,/ile (2pilapilaVacia())
{
>nteger c,;
c, = (>nteger) pilaquitar();
, = c,intValue();
S7stemoutprintln($V6rtice $ # g!erts),* # $ !isita"o$);
DD inserta en la pila los a"7acentes "e , no marca"os
for (int u = (; u - gnumero0eVertices(); u##)
DD a"7acente 7 no marca"o
if ((gmat+"),*)u* == 1) 88 (m)u* == CA+V4))
{
pilainsertar(ne, >nteger(u));
m)u* = 1;
}
}
return m;
}
}
Apartado 15.-.2, .#!tos de artic#laci!
static !oi" puntos+rticulacion(
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,)) DD a"7acente ,
{
if (2!isita"o),*)
{
arista),* = !; DD arista "el Irbol "e expansiJn
puntos+rticulacion(g3 ,3 num3 paso3 !isita"o3
arista3 ba.o);
if (ba.o),* 1= num)!*) DD ! cumple la regla K
S7stemoutprintln($V6rtice $ # ! #
$ es punto "e articulaciJn$);
ba.o)!* = %at/min(ba.o)!*3 ba.o),*);
}
else if (arista)!*2= ,) DD arco /acia atrIs
ba.o)!* = %at/min(ba.o)!*3num),*);
}
}
}

You might also like