CLASE 9 - Grafos Con Interfaces_2014

20
Programación 3 – Taller de JAVA 2014 Prof: Laura A. Fava Grafos Representaciones (2) Lista de adyacencia Un grafo G=(V,A) se representa como un arreglo/lista de |V| de vértices donde: (1) Matriz de adyacencia Un grafo G=(V,A) se representa como una matriz de boolean de |V| x |V| donde: G[u,v] = true si (u, v) Є A G[u,v] = false si (u, v) Є A G=(V,A) G=(V,A)

description

Unlp Class of objects

Transcript of CLASE 9 - Grafos Con Interfaces_2014

  • 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