View
23
Download
1
Category
Preview:
DESCRIPTION
Unlp Class of objects
Citation preview
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
GrafosRepresentaciones
(2) Lista de adyacenciaUn grafo G=(V,A) se representa como un arreglo/lista de |V| de vrtices donde:
(1) Matriz de adyacenciaUn grafo G=(V,A) se representa como una matriz de boolean de |V| x |V| donde:
G[u,v] = true si (u, v) AG[u,v] = false si (u, v) A
G=(V,A)
G=(V,A)
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
GrafosLa interfaces para definir Grafos
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
Grafos - La interfaces y clases
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
GrafosLa clase que implementa a la interface Arista
Arista: una arista siempre tiene el destino y podra tener un peso.
package estructuras.grafo;
public class AristaImpl implements Arista {private Vertice destino;private int peso;
public AristaImpl(Vertice dest, int p){destino = dest;peso = p;
}
@Overridepublic Vertice getVerticeDestino() {
return destino;}
@Overridepublic int getPeso() {
return peso;}}
Podra llamarse AritaImplListaAdy porque que solo se usa para Lista de Adyacencias
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
GrafosClase que implementa la interface Vertice
(con Listas de Adyacencia) package estructuras.grafo;public class VerticeImplListAdy implements Vertice {private T dato;private int posicion;private ListaEnlazadaGenerica adyacentes;
public VerticeImplListAdy(T d) {dato = d;adyacentes = new ListaEnlazadaGenerica();
}public int getPosicion() {return posicion;
}
public void conectar(Vertice v) {conectar(v, 1);
}
public void conectar(Vertice v, int peso) {Arista a = new AristaImpl(v, peso);if (!adyacentes.incluye(a))
adyacentes.agregarEn(a, 0);}
}. . .}
Vrtice: tiene un dato y una lista de adyacentes.En realidad se tiene una lista de aristas, dondecada una tiene un vrtice destino.
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
public class GrafoImplListAdy implements Grafo {ListaGenerica vertices = new ListaEnlazadaGenerica();public void agregarVertice(Vertice v) {
if (!vertices.incluye(v)){v.setPosicion(vertices.tamanio());vertices.agregar(v,vertices.tamanio());
}}public void conectar(Vertice origen, Vertice destino) {
((VerticeImplListAdy) origen).conectar(destino);}public void conectar(Vertice origen, Vertice destino, int peso) {
((VerticeImplListAdy) origen).conectar(destino,peso);}. . .}
GrafosLa clase que implementa a la interface Grafo
(con Listas de Adyacencia)
vertice
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
GrafosDFS (Depth First Search)
El DFS es un algoritmo de recorrido de grafos en profundidad. Generalizacin delrecorrido preorden de un rbol.Esquema recursivoDado G = (V , A)
1. Marcar todos los vrtices como no visitados.2. Elegir vrtice u (no visitado) como punto de partida.3. Marcar u como visitado.4. Para todo v adyacente a u, (u,v) A, si v no ha sido visitado, repetir recursivamente(3) y (4) para v.
Finalizar cuando se hayan visitado todos los nodos alcanzables desde u.Si desde u no fueran alcanzables todos los nodos del grafo: volver a (2), elegir un nuevovrtice de partida v no visitado, y repetir el proceso hasta que se hayan recorrido todoslos vrtices.
Cundo finaliza el recorrido?
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
El recorrido del DFS depende del orden en que aparecen los vrtices en las listas de adyacencia.
Vrtices del grafo
GrafosDFS (Depth First Search)
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
5
1
2
3
46
71
46
7
3
2 5
5
1
2
3
46
71
5
1
2
3
46
714
5
1
2
3
46
714
6
5
1
2
3
46
714
6
7
5
1
2
3
46
714
6
7
3
1
2
3
46
714
6
7
3
5
1
3
46
714
6
7
3
52
GrafosDFS (Depth First Search)
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
public class Recorridos {public void dfs(Grafo grafo){boolean[] marca = new boolean[grafo.listaDeVertices().tamanio()];for(int i=0; i
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
public class RecorridosTest {
public static void main(String[] args) {Vertice v1 = new VerticeImplListAdy("Buenos Aires");Vertice v2 = new VerticeImplListAdy("Santiago");Vertice v3 = new VerticeImplListAdy("Lima");. . .
Grafo ciudades = new GrafoImplListAdy();ciudades.agregarVertice(v1);ciudades.agregarVertice(v2);ciudades.agregarVertice(v3);. . .
ciudades.conectar(v1, v2);ciudades.conectar(v1, v3);ciudades.conectar(v1, v4);ciudades.conectar(v1, v5);ciudades.conectar(v3, v5);. . .Recorridos r = new Recorridos();System.out.println(--- Se imprime el GRAFO con DFS ---");r.dfs(ciudades);
}}
Uso del DFS
Buenos Aires
Montevideo
Lima
Santiago
Asuncin
Caracas
La Habana
GrafosDFS (Depth First Search)
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
public class Recorridos {public ListaEnlazadaGenerica dfs(Grafo grafo){
boolean[] marca = new boolean[grafo.listaDeVertices().tamanio()];ListaEnlazadaGenerica lis = new ListaEnlazadaGenerica();for(int i=0; i
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
Dado un Grafo orientado y valorado positivamente, como por ejemplo el que muestra lafigura, implemente un mtodo que retorne una lista con todos los caminos cuyo costototal sea igual a 10. Se considera costo total del camino a la suma de los costos de lasaristas que forman parte del camino, desde un vrtice origen a un vrtice destino.Se recomienda implementar un mtodo pblico que invoque a un mtodo recursivoprivado.
Buenos Aires
Montevideo
Lima
Santiago
Asuncin
Caracas
La Habana
43
10
6
24
4
11
10
500
Ejercicio de Parcial
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
public class Recorridos {public ListaGenerica dfsConCosto(Grafo grafo){boolean[] marca = new boolean[grafo.listaDeVertices().tamanio()];ListaGenerica lis = null;ListaGenerica recorridos =
new ListaGenericaEnlazada();int costo = 0;for(int i=0; i
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
public class Recorridos {private void dfsConCosto(int i, Grafo grafo, ListaGenerica lis,
boolean[] marca, int costo, ListaGenerica recorridos) {Vertice vDestino = null; int p=0,j=0;Vertice v = grafo.listaDeVertices().elemento(i);ListaGenerica ady = grafo.listaDeAdyacentes(v);ady.comenzar();while(!ady.fin()){
Arista arista = ady.proximo();j = arista.getVerticeDestino().getPosicion();if(!marca[j]){
p = arista.getPeso();vDestino = arista.getVerticeDestino();costo = costo+p;lis.add(vDestino);marca[j] = true;if (costo==10){
recorridos.add((lis.copia()); // se crea una copia de la lista y se guarda esa copia}this.dfsConCosto(j, grafo, lis, marca, costo, recorridos);costo=costo-p;lis.remove(vDestino);marca[j]= false;
}}
}}
Ejercicio de Parcial (2/3)
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
public class Recorridos {private void dfsConCosto(int i, Grafo grafo, ListaGenerica lis,
boolean[] marca, int costo, ListaGenerica recorridos) {Vertice vDestino = null; int p=0,j=0;Vertice v = grafo.listaDeVertices().elemento(i);ListaGenerica ady = grafo.listaDeAdyacentes(v);ady.comenzar();while(!ady.fin()){
Arista arista = ady.proximo();j = arista.getVerticeDestino().getPosicion();if(!marca[j]){
p = arista.getPeso();if ((costo+p)
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
public class Recorridos {public void bfs(Grafo grafo) {
boolean[] marca = new boolean[grafo.listaDeVertices().tamanio()];for (int i = 0; i < marca.length; i++) {if (!marca[i])
this.bfs(i+1, grafo, marca); //las listas empiezan en la pos 1}
}private void bfs (int i, Grafo grafo, boolean[] marca) {. . .
}}
Grafos BFS (Breath First Search)
Este algoritmo es la generalizacin del recorrido por niveles de un rbol. La estrategia esla siguiente: Partir de algn vrtice v, visitar v, despus visitar cada uno de los vrtices adyacentes a
v. Repetir el proceso para cada nodo adyacente a v, siguiendo el orden en que fueron
visitados.Si desde v no fueran alcanzables todos los nodos del grafo: elegir un nuevo vrtice departida no visitado, y repetir el proceso hasta que se hayan recorrido todos los vrtices.
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
public class Recorridos {. . .
private void bfs(int i, Grafo grafo, boolean[] marca) {ListaGenerica ady = null;ColaGenerica q = new ColaGenerica();q.poner(grafo.listaDeVertices().elemento(i));marca[i] = true;while (!q.esVacia()) {Vertice v = q.sacar();System.out.println(w);ady = grafo.listaDeAdyacentes(v);ady.comenzar();while (!ady.fin()) {
Arista arista = ady.proximo();int j = arista.getVerticeDestino().getPosicion();if (!marca[j]) {
Vertice w = arista.getVerticeDestino();marca[j] = true;q.poner(w);
}}}}}
Grafos BFS (Breath First Search)
q
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
Ejercicio de ParcialUn poderoso e inteligente virus de computadora infecta cualquier computadora en 1minuto, logrando infectar toda la red de una empresa con cientos de computadoras. Dadoun grafo que representa las conexiones entre las computadoras de la empresa, y unacomputadora ya infectada, escriba un programa en Java que permita determinar el tiempoque demora el virus en infectar el resto de las computadoras. Asuma que todas lascomputadoras pueden ser infectadas, no todas las computadoras tienen conexin directaentre si, y un mismo virus puede infectar un grupo de computadoras al mismo tiempo sinimportar la cantidad.
Programacin 3 Taller de JAVA 2014 Prof: Laura A. Fava
public class BFSVirus {public int calcularTiempoInfeccion(Grafo g, Vertice inicial) {int n = g.listaDeVertices().tamanio();ColaGenerica cola = new ColaGenerica();boolean visitados[] = new boolean[n];int distancias[] = new int[n];int maxDist = 0;for (int i = 0; i < n; ++i) {
visitados[i] = false; distancias[i] = Integer.MAX_VALUE;}distancias[inicial.getPosicion()] = 0;cola.encolar(inicial);while (!cola.esVacia()) {
Vertice v = cola.desencolar();ListaGenerica adyacentes = v.obtenerAdyacentes();adyacentes.comenzar();while (!adyacentes.fin()) {
Arista a = adyacentes.proximo();Vertice w = a.getVerticeDestino();int nuevaDist = distancias[v.getPosicion()] + 1;int pos = w.getPosicion();if (!visitados[pos]) {
visitados[pos] = true;distancias[pos] = nuevaDist;if (nuevaDist > maxDist)
maxDist = nuevaDist;cola.encolar(w);
}}}return maxDist;
}}
Ejercicio de Parcial
Recommended