Está en la página 1de 73

AE | TAD GRAFO

Universidad ORT Uruguay

AGENDA
Definiciones Aplicaciones Ejemplos Representaciones posibles

Matriz de Adyacencia Lista de Adyacencia

Sub-grafos inducidos rboles de Cubrimiento Recorridas sobre Grafos

DFS: Depth First Search. BFS: Breadth First Search.


Dijkstra: Camino ms corto entre vrtices

DEFINICIN INFORMAL

Es una coleccin de entidades (denominadas nodos o vrtices) conectadas por un conjunto de enlaces (denominados aristas o arcos).
1 2
arista

5 4 3 7 6
vrtice

DEFINICIN FORMAL

Notacin de conjuntos.

Coleccin G = (V, A) con A VxV. V: conjunto de vrtices, denotados genricamente como v,w. A: conjunto de aristas, denotadas como (v, w) con v, w V.

En palabras:
Un grafo G = (V, A) consta de un conjunto de vrtices V y un conjunto de aristas A. Cada arista (arco) es un par (v, w) donde v, w V. Si el par es ordenado, entonces el grafo es dirigido. Si el par tiene asociado un tercer valor (su peso), entonces el grafo es ponderado.

EJEMPLOS
1 2 5 4 3 6
1 4 5

Grafo: Dirigido No ponderado.

7
2 2

1
4 6 6 1

3
1 2

-10 5 6 7

Grafo: Dirigido Ponderado.

3 2

MS DEFINICIONES

Un camino en un grafo es una secuencia de vrtices w1, w2, ..., wn tal que (wi, wi+1) A, 1<=i<n. La longitud de un camino es la cantidad de aristas del camino. Se permiten caminos de un vrtice a si mismo; si este camino no contiene aristas, entonces el camino tiene longitud 0. Una arista (v,v) de un grafo es un ciclo. Un camino simple es un camino tal que todos los vrtices son distintos, excepto que el primero y el ltimo pueden ser el mismo.

MS DEFINICIONES

Un grafo dirigido es acclico (GDA) si no tiene ciclos. Ejemplo: Previaturas en las materias de una carrera.

P1

P2 LG

A1

A2

M1

MD

MS DEFINICIONES

Un grafo no dirigido es conexo si hay un camino desde cualquier vrtice a cualquier otro. Un grafo dirigido con esta propiedad se denomina fuertemente conexo.

Grafo no dirigido Conexo

Grafo dirigido Fuertemente Conexo

MS DEFINICIONES

Si un grafo dirigido no es conexo, pero el grafo subyacente (sin direccin en los arcos) es conexo, se dice que el grafo es dbilmente conexo.

Grafo dbilmente conexo.

MS DEFINICIONES

Un grafo completo es un grafo en el cual hay una arista entre cualquier par de vrtices.

K3

K8

APLICACIONES VARIAS

Sistemas de informacin geogrfica. Representacin estructural de vnculos en pginas web. Representacin estructural y flujo de redes (grafos ponderados):

Telecomunicaciones, computacin, transporte, etc.

Determinar camino mnimo entre dos puntos.


Determinar rboles de cubrimiento.

SISTEMA DE AEROPUERTOS
Madrid

Nueva Delhi

Miami Gibraltar

Rio

Mvd BsAs

SISTEMA DE AEROPUERTOS
Cada aeropuerto es un vrtice. Cada arista representa un vuelo de la aerolnea. La arista podra tener un peso que represente la cantidad de Kms o el costo en U$S del tramo. El grafo es dirigido ya que puede ser ms largo o costar ms volar en direcciones diferentes. Es deseable que el grafo modelado sea fuertemente conexo de manera que podamos volar de cualquier ciudad a cualquier otra (aunque sea haciendo escalas).

TAD GRAFO - OPERACIONES


Grafo crearGrafoVacio(); Grafo agregarVertice(Grafo g, Vertice v); Grafo agregarArista(Grafo g, Arista a); Grafo borrarVertice(Grafo g, Vertice v); Grafo borrarArista(Grafo g, Arista a); Boolean esVacio(Grafo g); Lista VerticesAdyacentes(Grafo g, Vertice v); Boolean sonAdyacentes(Vertice a, Vertice b); Boolean existeVertice (Vertice v);

GRAFOS INTERFAZ
public interface IGrafo { //Pre: v no pertenece al grafo.

// 0<v<=capacidad grafo
//Post: Agrega el vrtice v al grafo public void agregarVertice(int v);

//Pre: origen y destino son los ndices de vrtices ya ingresados en el grafo


//Post: Agrega la arista origen-destino de peso "peso" en el grafo public void agregarArista(int origen, int destino, int peso);

GRAFOS INTERFAZ
//Pre: El vrtice v existe en el grafo //Post: Elimina el vrtice y todas las aristas a las que pertenezca public void eliminarVertice(int v); //Pre: La arista origen - destino existe en el grafo //Post: Elimina la arista origen - destino public void eliminarArista(int origen, int destino);

GRAFOS INTERFAZ
//Pre: El vrtice v existe en el grafo //Post: Retorna una lista con los vrtices adyacentes de v. // Si v no tiene adyacentes retorna la lista vaca public Lista verticesAdyacentes(int v); //Pre: a y b son vrtices del grafo

//Post: Retorna true sii los vrtices a y b son adyacentes.

public boolean sonAdyacentes(int a, int b);

GRAFOS INTERFAZ
//Post: Retorna true sii el vrtice fue ingresado al grafo

public boolean estaVertice(int v);


//Post: Retorna true sii el grafo esta vaco public boolean esVacio(); }

GRAFOS CMO LOS REPRESENTAMOS?

Matriz de Adyacencia.

Matriz de adyacencia para grafo no dirigido

GRAFOS MATRIZ DE ADYACENCIA

Se define una matriz a de V x V.

Para cada arista (v,w), a[v,w] = VALOR; Si no, se pone NO_VALOR.

Si el grafo es no ponderado, VALOR = 1, NO_VALOR = 0 (matriz booleana) Si el grafo es ponderado, el valor utilizado ser la ponderacin. Ej cantidad de kms. entre un aeropuerto y otro.

2 5 4

GRAFOS: MATRIZ ADYACENCIA IMPLEMENTACIN


public class Arco { public boolean existe; public int peso; public Arco() {

3 6

this.existe = false;
this.peso = 0; } public Arco(int peso) { this.existe = true; this.peso = peso; } }

public class GrafoMatriz implements IGrafo{ int size; int cantNodos; Arco[][] matrizAdyacencia; boolean[] nodosUsados;
3

2 5 4 7 6

//Crea el grafo vacio (sin nodos ni aristas) con capacidad de almacenamiento de n vrtices public GrafoMatriz(int cantNodos) { this.size = 0; this.cantNodos = cantNodos; this.matrizAdyacencia = new Arco[cantNodos+1][cantNodos+1]; for (int i = 1; i<=cantNodos; i++)

for (int j = 1; j<=cantNodos; j++)


this.matrizAdyacencia[i][j]= new Arco(); this.nodosUsados = new boolean[cantNodos+1]; }

public void agregarArista(int origen, int destino, int peso) {

Arco nuevo = new Arco(peso);


this.matrizAdyacencia[origen][destino] = nuevo; } public void agregarVertice(int v) { this.nodosUsados[v]=true; this.size ++; }

public void eliminarArista(int origen, int destino) {


Arco nuevo = new Arco(); this.matrizAdyacencia[origen][destino] = nuevo; }

public void eliminarVertice(int v) {

this.nodosUsados[v]=false;
this.size --; //Elimino las aristas donde v es miembro

for(int i=1;i<=this.cantNodos;i++){
this.matrizAdyacencia[i][v] = new Arco(); this.matrizAdyacencia[v][i] = new Arco(); } } public boolean esVacio() { return this.size==0; } public boolean sonAdyacentes(int a, int b) { return this.matrizAdyacencia[a][b].existe; }

public Lista verticesAdyacentes(int v) { Lista l = new Lista(); for(int i=1; i<=this.cantNodos; i++){ if(this.sonAdyacentes(v, i)){ l.insertarInicio(i); } } return l;

}
public boolean estaVertice(int v) { return this.nodosUsados[v]; }

GRAFOS MATRIZ DE ADYACENCIA

Ventajas

Simplicidad. Chequear si una arista est presente es inmediato.

Desventajas

Consume VxV de espacio de memoria. Si el grafo no es denso la representacin no parece tan adecuada.

Ejemplo de Desventaja

Calles de Manhattan - Libro Weiss.

LISTA DE ADYACENCIA

Se define un arreglo de tamao |V|, cada vrtice almacena la lista de aristas que salen de l hacia el resto de sus vrtices adyacentes. 3 4 1 2 1 2 2 3 4 5 4 6 6 4 7 7
6

5
5

6
7

GRAFOS: LISTA ADYACENCIA IMPLEMENTACIN


3

2 5 4 7 6

public class GrafoLista{ int size; int cantNodos; ListaAdy[] listaAdyacencia; boolean[] nodosUsados;

//Crea el grafo vacio (sin nodos ni aristas) con capacidad de almacenamiento de n vrtices public GrafoLista(int n) { this.size = 0; this.cantNodos = n; this.listaAdyacencia = new ListaAdy[this.cantNodos+1];

for (int i = 1; i<=this.cantNodos; i++)


this.listaAdyacencia[i]= new ListaAdy(); this.nodosUsados = new boolean[this.cantNodos+1]; }

public void agregarArista(int origen, int destino, int peso) { this.listaAdyacencia[origen].insertar(destino, peso); } public void agregarVertice(int v) { this.nodosUsados[v]=true;

this.size ++;
} public void eliminarArista(int origen, int destino) { this.listaAdyacencia[origen].eliminar(destino); } public boolean esVacio() { return this.size==0;

}
public boolean sonAdyacentes(int a, int b) { return this.listaAdyacencia[a].pertenece(b); }

public void eliminarVertice(int v) {

this.nodosUsados[v]=false;
this.size --; //Elimino las aristas donde v es miembro this.listaAdyacencia[v] = new ListaAdy(); //BUSCAR EN TODOS LOS VERTICES LA ARISTA for (int i = 1; i<=cantNodos; i++) this.listaAdyacencia[i].eliminar(v); } public ListaArco verticesAdyacentes(int v) { return this.listaAdyacencia[v]; } public boolean estaVertice(int v) { return this.nodosUsados[v]; }

LISTAS DE ADYACENCIA

Ventajas

El array que tenemos que definir es de tamao V. Y luego tenemos que agregar un nodo por cada una de las aristas. Lo cul si el grafo no es muy denso consume significativamente menos memoria que VxV de la matriz de adyacencia. Retornar la lista de vrtices adyacentes a un vrtice dado es simple.

Desventajas

El cdigo de algunos algoritmos se vuelve ms ineficiente.

GRAFOS MS DEFINICIONES

Un c a m i n o h a m i l t o n i a n o en un grafo G, es aquel camino que pasa una y solo una vez por cada vrtice del grafo.
Si adems el ltimo vrtice visitado es adyacente al inicial, entonces es un ciclo hamiltoniano

GRAFOS MS DEFINICIONES

Un c a m i n o e u l e r i a n o en un grafo G, es aquel camino que pasa una y solo una vez por cada arista del grafo.

Mapa de Knigsberg en la poca de Leonhard Euler

GRAFOS PUENTES DE KNIGSBERG


Es posible dar un paseo comenzando desde cualquiera de estas regiones, pasando por todos los puentes, recorriendo slo una vez cada uno, y regresando al mismo punto de partida?

Abstraccin de los puentes de Knigsberg

GRAFOS CAMINO EULERIANO


E

1) Podemos encontrar caminos Eulerianos en las figuras? 2) Cules son los vrtices candidatos a ser inicio y fin en la casita?

GRAFOS MS DEFINICIONES

Sea una grafo G conexo, si existe v V tal que G {v} es desconexo, entonces v se denomina p u n t o d e articulacin. Si G no tiene puntos de articulacin es b i c o n e x o . Un rbol es un grafo acclico, conexo y no dirigido.
Un rbol con n vrtices tiene n-1 aristas. Si se agrega una arista a un rbol, se obtiene un grafo con un ciclo. Si se elimina una arista a un rbol, entonces se obtiene un grafo no conexo.

SUB GRAFOS DEFINICIONES


Dado el grafo G = (V, A): Subgrafo inducido por vrtices:

Subgrafo G = (V, A) con V V , con A = {(v, w) A | v y w V}.

Subgrafo recubridor:

Subgrafo G = (V, A) con A A.

SUB GRAFOS DEFINICIONES

Sea el grafo G = (V, A) conexo y no dirigido, el subgrafo T = (V, A) es un rbol de cubrimiento de G, si es conexo y si A A es tal que |A| es mnimo.
1 2 5 4 3 6 1 2 5

4 7
3 7

RECORRIDAS SOBRE GRAFOS

Recorrer un grafo significa tratar de alcanzar todos los vrtices relacionados con un vrtice en particular que llamaremos vrtice de salida. Existen bsicamente dos tcnicas para recorrer un grafo:
DFS Depth First Search. BFS Breadth First Search.

Para realizar estas recorridos consideramos que un grafo como G={V,A}, y cada vrtice almacenar un estado que tomar los valores (visitado, no visitado).

RECORRIDAS - DFS

El recorrido DFS explora sistemticamente las aristas del grafo de manera que primero se visitan los vrtices adyacentes a los visitados ms recientemente. De esta forma se va profundizando en el grafo, es decir, alejndose progresivamente del nodo inicial. Esta estrategia admite una implementacin simple en forma recursiva.

RECORRIDAS - DFS

Dado un vrtice v de partida, se lo marca como visitado. Luego para todo vrtice adyacente a v que no haya sido visitado, se lo toma como nuevo punto de partida y se invoca recursivamente al procedimiento. Cuando estn marcados todos los vrtices adyacentes a v, el recorrido que comenz en v ha finalizado. Si queda algn vrtice que no haya sido visitado, se lo toma como nuevo punto de partida hasta visitar todos los vrtices.

RECORRIDAS - DFS
Procedimiento DFS (vertice v) Comienzo Marcar v Para cada w adyacente a v Si w no marcado entonces DFS(w) Fin Para Fin

RECORRIDAS - DFS
Procedimiento Recorrido_DFS(grafo G) //Todos los vrtices comienzan no marcados. Comienzo Para cada v V: Si v no-marcado entonces DFS(v) Fin

RECORRIDAS - DFS

RECORRIDAS - DFS

RECORRIDAS - DFS

RECORRIDAS - DFS

RECORRIDAS - DFS

RECORRIDAS - DFS

RECORRIDAS - DFS

RECORRIDAS - DFS

In-Order, Pre-Order, Post-Order? Se puede establecer un claro paralelismo entre el recorrido en pre-order de un rbol y el DFS sobre un grafo. Qu pasa si no se visitan todos los vrtices del grafo?
Hemos encontrado un grafo no conexo. Aplicamos DFS a cada una de las componentes conexas.

RECORRIDAS - DFS

Al aplicar DFS a un grafo obtenemos un rbol de cubrimiento para el mismo.

RECORRIDAS - DFS

El orden de los vrtices del grafo que produce un DFS no es nico. Depende de en qu vrtice comience el recorrido y en qu orden se van tomando los adyacentes de un vrtice dado. Ejemplo:

RECORRIDAS - DFS

Recorrido 1 {1, 2, 3, 6, 5, 4, 7}

Inicio en vrtice 1, Tomando adyacentes por orden de etiqueta. Inicio en vrtice 5, Tomando adyacentes por orden de etiqueta. Inicio en vrtice 7, Tomando adyacentes por mayor etiqueta.

Recorrido 2 {5, 1, 2, 3, 6, 4, 7}

Recorrido 3 {7, 5, 6, 3, 2, 1, 4}

RECORRIDAS - BFS

El recorrido BFS comienza en un vrtice dado y visita primero a todos sus vrtices adyacentes. Luego para cada vrtice adyacente, recorre los vecinos respectivos no visitados. As sucesivamente hasta alcanzar todos los vrtices. Esta estrategia admite una implementacin simple en forma iterativa.

RECORRIDAS - BFS

RECORRIDAS - BFS

RECORRIDAS - BFS

RECORRIDAS - BFS

RECORRIDAS - BFS

RECORRIDAS - BFS
Procedimiento BFS (vertice v) Comienzo CrearCola(Q)

Marcar(v)
Enqueue(Q,v) Mientras No-Vacia(Q) u = Front(Q)

Dequeue(Q)
Para cada w adyacente a u Si w no marcado Marcar(w) Enqueue(Q,w) Fin Si Fin Para Fin Mientras Fin

RECORRIDAS - BFS
Procedimiento Recorrido_BFS(grafo G) //Todos los vrtices comienzan no marcados. Comienzo Para cada v V: Si v no-marcado entonces BFS(v) Fin

RECORRIDAS - BFS

Al aplicar BFS obtenemos los caminos ms cortos desde el vrtice inicial a todos los dems vrtices del grafo. Tambin obtenemos un rbol de cubrimiento para el grafo.

BREADTH FIRST SEARCH RESUMEN


Dado un vrtice fuente s, BFS explora sistemticamente los vrtices de G para descubrir todos los vrtices alcanzables desde s. Calcula la distancia (menor nmero de vrtices) desde s a todos los vrtices alcanzables. Produce un rbol de cubrimiento con raz s. El camino desde s a cada vrtice en este recorrido contiene el mnimo nmero de vrtices. Es el camino ms corto medido en nmero de vrtices. Su nombre se debe a que expande uniformemente la frontera de los nodos no marcados. Llega a los nodos de distancia k, slo luego de haber llegado a todos los nodos a distancia k-1.

APLICACIONES DFS BFS

DFS y BFS

Conectividad de un grafo no dirigido. Si al aplicar DFS o BFS desde cualquier * vrtice del grafo logramos marcar todos los dems vrtices entonces podemos afirmar que el grafo es conexo. Generacin de rbol de cubrimiento.

BFS

Camino ms corto de (u,v). Aplicamos BFS(u) y paramos cuando marcamos v.

*Cualquier: Debe cumplirse para cualquiera de los nodos sin importar cual. No alcanza que se cumpla para uno en particular, debe cumplirse para todos.

ESQUELETO MINIMO

Un esqueleto o rbol de cubrimiento del grafo G es un subgrafo que es un rbol y que contiene todos los vrtices de G El esqueleto mnimo de un grafo ponderado es aquel esqueleto de valor mnimo Permite calcular el costo mnimo de conexin de un grafo.

Algoritmos para calcularlo:


Algoritmo de Prim Algoritmo de Kruskal

ALGORITMO DE DIJKSTRA
v H

2
14
v G

B
9 1
2 1 4

6 3
v F

1
v D

A
C

v E

ALGORITMO DE DIJKSTRA
Inicializacion: N = {A} // Se toma el vrtice A como el inicial. Para todos los vrtices del grafo if v adyacente a A D(v) = c(A,v) else D(v) = infinito Loop Encontrar w que no pertenezca a N/ D(w) sea mnima. Agregar w a N Actualizar D(v) para todo v adyacente a w y que no este en N, de forma: D(v) = min( D(v), D(w) + c(w,v)) until todos los vrtices estn en N. //c denota costo.

ALGORITMO DE DIJKSTRA
Paso N D(A) P(A) D(B) P(B) D(C) P(C) D(D) P(D) D(E) P(E) D(G) P(G) D(H) P(H)

0 1 2 3 4 5 6 7

F
F,E F,E,D F,E,D,C F,E,D,C, G F,E,D,C, G,B F,E,D,C, G,B, A F,E,D,C, G,B,A,H 7,C 7,C 11,D 5,C 5,C 4,E 3,D

3,F
2,E

1,F

6,F
6,F 3,D

3,D
17,G 7,B 7,B

6,B

Ejemplo para correr otro Dijkstra.

A B C D

C,2 E,4 A,2 A,2 B,4 C,4 E,2 B,1

D,2 H,1 F,4 F,9 G,2 D,9 F,3 D,8 G,3 H,7 G,7 H,8

E
F G

Grafo del ejemplo anterior.

También podría gustarte