Está en la página 1de 25

UNIVERSIDAD NACIONAL DE LA PATAGONIA AUSTRAL

Unidad Académica Río Gallegos

Estructura de Datos

Tema 5:
Grafos (clase 1)

Docente: Lic. Héctor Reinaga

Indice
 Introducción
 Concepto Grafos
 Clasificación
 Dirigidos
 No dirigidos
 Etiquetados
 Terminología de Grafos:
 Bucle, Sucesor, Predecesor, Grado, Vértice aislado, Camino, Longitud,
Camino simple, Ciclo, Cadena, Conectividad.
 TDA Grafos
 Implementación
 Matriz de adyacencia
 Listas de adyacencia
 Operaciones
 Recorrido en profundidad
 Recorrido en anchura

Grafos Estructura de Datos 2019 1

1
Introducción
Pila Cola

 Estructuras de datos estudiadas:


 TDA lineales:
 Listas, pilas, colas.
 Colección de elementos donde cada uno
tiene un elemento siguiente y uno anterior.

Lista

 Las relaciones entre los nodos de información son lineales.


 Todos los nodos tienen un único antecesor, excepto el
primero que no tiene antecesor.
 Todos los nodos tienen un único sucesor, excepto el último
que no tiene sucesor.

Grafos Estructura de Datos 2019 2

Introducción
 Estructuras de datos estudiadas:

 TDA no lineales:
 árboles y sus variantes
 Cuando se está en presencia de relaciones no lineales de tipo
jerárquica, se utilizan los árboles.
 Un nodo puede tener más de un sucesor.
 Cada nodo tiene un único padre, exceptuando al nodo raíz del árbol, que no
tiene padre.
 … A
 Árbol Binario:
 Un nodo solo puede apuntar a 2 nodos. B C
 Un nodo es apuntado a lo sumo por 1 nodo.

D E F G
Grafos Estructura de Datos 2019 3

2
Introducción
 Ahora generalizamos la estructura de árbol
 permitir que un elemento pueda tener más de un elemento anterior y
siguiente.
 En ocasiones, se requiere tener acceso a un nodo determinado a partir
de más de un nodo de la estructura. Existen varios caminos entre un
nodo y otro.
 Ejemplos:
 Una red hidráulica,
 Caminos entre ciudades,
 Ruta aérea
 Red de computadoras, etc.
Ciudad B
Ciudad A Ciudad D

Ciudad C
Ciudad F
Ciudad E

Grafos Estructura de Datos 2019 4

Concepto: grafos
 Conceptos:
 Un grafo es una estructura donde cada elemento pueda
tener cero, uno o muchos elementos anteriores y siguientes.
 Un grafo es un TDA que representa un conjunto finito N de
nodos, llamados vértices, relacionados entre sí por un
conjunto R de aristas/arcos.

 Ejemplo:
 Grafo A
B
 5 vértices y 6 arcos.
 Vértices del Grafo C
N ={ A, B, C, D, E } D
 E
 Arcos del Grafo
 R={(A, A), (A, B), (A, D), (A, C), (D, C), (C, E)}

Grafos Estructura de Datos 2019 5

3
Clasificación
 Es importante recordar que un mismo grafo puede tener diferentes
representaciones gráficas.
 Ejemplo:
 Dos representaciones del mismo grafo
 G = ({a,b,c,d,e,f},{{a,b},{a,e},{a,f}{e,f},{b,c},{c,d},{e,d},{d,f}})

Grafos Estructura de Datos 2019 6

Clasificación
 Básicamente, podemos clasificar los grafos en 4 tipos
dependiendo de dos criterios (dirigido y etiquetado)

 Grafo dirigido. Es aquel cuyas aristas forman pares


ordenados (u, v).
 Grafo no dirigido. Es aquel cuyas aristas no son pares
ordenados. (u,v)=(v,u)
 Grafo etiquetado o valorado. Cuando se asocia
información a cada arista de un grafo.
 Grafo no etiquetado. Cuando no se asocia ninguna
información a las aristas.

Grafos Estructura de Datos 2019 7

4
Grafos dirigidos
 Un grafo es dirigido cuando los arcos tienen dirección.
A
B

C
D
E
 Dado un arco (A,B) del conjunto R, se dice que
 A es el origen
 B es el destino
 En este caso, las aristas se llama arcos y se representan como
pares para indicar el orden:
 V = { A,B,C,D,E}
 R={(A, A), (A, B), (A, D), (A, C), (D, C), (C, E)}
 También conocido como digrafos

Grafos Estructura de Datos 2019 8

Grafos no dirigidos
 Un grafo es no-dirigido cuando los arcos no tienen
dirección.
 Es irrelevante el sentido de los arcos.
 El arco que los relaciona aparece una sola vez en el
conjunto R de arcos del grafo.
A
B

C
D
E

 Si el grafo es no orientado, al arco se le llama arista.

Grafos Estructura de Datos 2019 9

5
Grafos etiquetados
 Los vértices y arcos (o aristas) de un grafo pueden
ser elementos con información adicional unida a
ellos.
 Tales grafos se llaman grafos etiquetados o
ponderados.
 Ejemplo: Ciudad2
2
120 95

Ciudad1 1 154 4 Ciudad4

101 175
94
3

Ciudad3

Grafos Estructura de Datos 2019 10

Terminología de Grafos

6
Definiciones básicas
 Se dan a continuación una serie de conceptos definidos sobre
grafos dirigidos (digrafos).
 Para ejemplificar los mismos usaremos el siguiente grafo:

Grafos Estructura de Datos 2019 12

Terminología de Grafos
 Bucle
 Arco de la forma (x, x), es un arco que tiene por origen y destino al
mismo vértice.
 Ejemplo:
 En el grafo dado existen dos bucles:
 el (v2, v2) y el (v7, v7).

Grafos Estructura de Datos 2019 13

7
Terminología de Grafos
 Sucesor/Adyacente
 Se dice que el nodo y es sucesor o adyacente del nodo x, si existe un arco
que tenga por origen a x y por destino a y, es decir sí el arco (x, y)  A.
 Al conjunto de nodos sucesores de x lo denotaremos con S(x).

 Ejemplo:
 Conjunto de sucesores de v4
 Existen dos arcos que tienen como origen a v4: (v4, v3) y (v4, v5)
 S(v4) = {v3, v5}
 Conjunto de sucesores de v2
 Existen cuatro arcos que tienen como origen a v2:
 (v2, v2), (v2, v3), (v2, v4) y (v2, v5)
 S(v2) = {v2, v3, v4, v5}
 Que pasa con v3 y v6?
 conjunto de sucesores es vacío
 S(v3) = S(v6) = 

Grafos Estructura de Datos 2019 14

Terminología de Grafos
 Predecesor/Incidente
 Se dice que el nodo y es predecesor del nodo x, si existe un arco que tenga
por origen a y y por destino a x, es decir sí el arco (y, x)  A.
 Al conjunto de nodos predecesores de x lo denotaremos con P(x).

 Ejemplo:
 Conjunto de predecesores de v4:
 El vértice v4 es destino de tres arcos
 (v1, v4), (v2, v4) y (v5, v4)
 P(v4) = {v1, v2, v5}
 Conjunto de predecesores de v3:
 El vértice v4 es destino de dos arcos
 (v2, v3) y (v4, v3)
 P(v2) ={v2, v4}
 Que pasa en el caso v2?
 Forma parte de su conjunto de predecesores y de su conjunto de sucesores.
 Existe un bucle en v2.

Grafos Estructura de Datos 2019 15

8
Terminología de Grafos
 Grado:
 El grado de un vértice, es la suma de los grados de entrada y de
salida del vértice
 El grado de entrada de un vértice n es el número de arcos que llegan
a él: g-(x) = |P(x)|
 El grado de salida de un vértice n es el número de arcos que sale de
él: g+(x) = |S(X)|
 Grado del nodo x:
 g(x) = |P(x)  S(X)|
 Ejemplo:
 Cálculo de grados para v4:
 g-(v4) = |{v1, v2, v5}| = 3
 g+(v4) = |{v3, v5}| = 2
 g(v4) = |{v1, v2, v5}  {v3, v5}| = 5

Grafos Estructura de Datos 2019 16

Terminología de Grafos
 Vertice aislado:
 Se dice que un vértice x es aislado sí el grado es igual a cero, es decir,
g(x)=0.

 Ejemplo:
 Vértice v6:
 Único vértice aislado
 g(v6) = |P(v6)  S(v6)| = || = 0
 Que pasa con el vértice v7?
 no puede ser considerado como aislado, dado que al tener un bucle su grado es
1.
 En general, para que un vértice se considere aislado no tiene que ser origen
ni destino de ningún arco, ni siquiera un bucle.

Grafos Estructura de Datos 2019 17

9
Terminología de Grafos
 Camino:
 Existe un camino del vértice x al vértice y, si podemos llegar de x a y siguiendo los
arcos y en el sentido en que éstos están.
 Ejemplo:
 Camino de v1 a v5
 Dos caminos:
 (v1, v2), (v2, v4) y (v4, v5)
 (v1, v4) y (v4, v5).

 Longitud:
 La longitud del camino es igual a la cantidad de arcos que lo forman, o número de
vértices menos 1.
 Ejemplo:
 Camino de v1 a v5
 Longitud es 3
 Camino de longitud nula:
 V3
 Camino de longitud 4:
 (V5,V1), (V1,V2), (V2,V4), (V4,V3)

Grafos Estructura de Datos 2019 18

Terminología de Grafos
 Camino simple
 si no pasa dos veces por un mismo vértice.
 Ejemplo:
 La secuencia <v1, v2, v4, v5, v4, v5, v1>, es simple?
 No
 La secuencia <v1, v4, v3>
 Si

 Ciclo
 es un camino simple de longitud mayor que 1, en donde coinciden
los vértices primero y último.
 Ejemplo:
 La secuencia <v1, v2, v4, v5, v1>, es ciclo?
 si y su longitud es 4.

Grafos Estructura de Datos 2019 19

10
Terminología de Grafos
 Cadena:
 Concepto similar a camino
 Existe una cadena del vértice x al vértice y, si podemos llegar de x a y siguiendo los
arcos, sin tener en cuenta el sentido de los mismos.
 Ejemplo:
 Camino de origen V3
 Existe camino?
 No
 Existen cadenas con inicio en ese vértice?
 Si, por ejemplo v3- v4-v5.
 Longitud de la cadena
 Cantidad de aristas/arcos que la forman
 Cadena simple
 si no pasa dos veces por un mismo vértice.
 Circuito
 es una cadena simple de longitud mayor que 1, en donde coinciden los vértices primero y
último.
 Resumen:
 Todo camino es una cadena, pero no toda cadena es un camino.
 Todo ciclo es un circuito, pero no todo circuito es un ciclo.

Grafos Estructura de Datos 2019 20

Terminología de Grafos
 Cadena:
 Ejemplo:
 Las siguientes secuencias son ejemplos de cadena:
 <v1, v2, v4, v5>, <v2, v1, v4>, <v3, v2, v4, v5>, <v2, v2>
 Las siguientes secuencias además de cadenas son circuitos:
 <v5, v2, v4, v5>, <v1, v2, v4, v5, v1>, <v3, v4, v2, v3>.
 Existe cadena en v6?
 No porque v6 es un vértice aislado.
 Existe cadena en v7?
 Si, una sola cadena con inicio en v7: <v7, v7>
 Es bucle

Grafos Estructura de Datos 2019 21

11
Conectividad
 Grafo conectado/conexo
 Cuando existe siempre un camino que une 2 vértices cualquiera.
 Grafo completo/fuertemente conectado
 Cuando cada vértice está conectado con todos y cada uno de los
nodos restantes (cada nodo es adyacente a los demás).

 Grafo conectado
 Grafo conectado  Grafo NO conectado
 No fuertemente conectado no existe camino entre v5 y v3
 Fuertemente conectado 
no existe camino entre v3 y v2
Por lo tanto, no fuertemente

conectado

Grafos Estructura de Datos 2019 22

TDA Grafos

Implementación de Grafos

12
TDA Grafos
 Como tipo de dato abstracto un grafo G = (V, A)
consta de:
 conjunto de vértices V
 conjunto de arcos A
 operaciones actuando sobre estos dos conjuntos.
 Se definen tres clases:
 Grafos
 Vertice
 objeto compuesto de una etiqueta
 Arco
 objeto compuesto de dos vértices y opcionalmente de una
etiqueta.

Grafos Estructura de Datos 2019 24

TDA Grafos
 Algunas operaciones sobre grafos:
 Construir un grafo.
 Verificar si un grafo está vacío o no.
 Insertar vértices y arcos.
 Eliminar vértices y arcos.
 Dados dos vértices, determinar si son adyacentes.
 Dado un vértice, determinar cuáles vértices son adyacentes
a él.
 Dados dos vértices, determinar un camino de longitud k
entre ellos.
 Dado un arco, determinar vértices incidentes a él.
 Determinar si el grafo es cíclico.
 Etc.

Grafos Estructura de Datos 2019 25

13
Implementación
 Para representar un grafo se pueden emplear
varias estructuras de datos.
 La selección apropiada depende de las
operaciones que se realizarán sobre los
vértices y sobre los arcos del grafo.
 Vamos a ver dos posibles implementaciones:
 Mediante matrices de adyacencia. (estática)
 Mediante listas de adyacencia. (dinámica)

Grafos Estructura de Datos 2019 26

Matriz de adyacencia
 La representación matricial permite establecer si hay
relación entre cada vértice del grafo y los demás.
 Para ello, se utiliza una matriz cuadrada.
 Se utiliza un arreglo bidimensional.
 Los elementos de la matriz son booleanos.
 Si el elemento (i, j) es verdadero, existe un arco que va del
vértice i al vértice j y,
 si el elemento (i, j) es falso, no existe arco del vértice i al
vértice j.
 Si el grafo es no dirigido.
 Si existe el arco del vértice i al vértice j, entonces existe el
arco del vértice j al vértice i.

Grafos Estructura de Datos 2019 27

14
Matriz de adyacencia
 Ejemplo: Grafo dirigido y no dirigido

1 2 3 4 1 2 3 4

1 F T F F 1 F T F F

2 F F F T 2 T F T T

3 F T F F 3 F T F T
4 F F T F 4 F T T F

Grafos Estructura de Datos 2019 28

Matriz de adyacencia
 La implementación básica para un grafo dirigido es la siguiente:
public class Graph public void insertEdge(Object originElement, Object finishElement)
{ {
private Vertex[] vertices; int originPosition=getVertexOrder(originElement);
private int vertexPosition; int finishPosition=getVertexOrder(finishElement);
private boolean[][] edges; edges[originPosition][finishPosition]=true;
private int vertexQuantity; }
private int getVertexOrder(Object element)
Graph(int quantity) {
{ int position=0, order=-1;
vertexQuantity=quantity; boolean found=false;
vertices=new Vertex[vertexQuantity];
vertexPosition=0; while(position<vertexQuantity & found==false)
edges=new boolean[vertexQuantity][vertexQuantity]; {
} if(vertices[position].getElement().equals(element))
public void insertVertex(Object element) {
{ found=true;
vertices[vertexPosition]=new Vertex(); order=position;
vertices[vertexPosition].setElement(element); }
vertexPosition++; position++;
} }
return order;
}
}

Grafos Estructura de Datos 2019 29

15
Matriz de adyacencia
 La implementación básica para un grafo dirigido (continúa):

public class Vertex


{
private Object element;

Vertex()
{
element=null;
}

public Object getElement()


{
return element;
}

public void setElement(Object element)


{
this.element=element;
}
}

Grafos Estructura de Datos 2019 30

Matriz de adyacencia: análisis


Ventajas
 Representación y operaciones muy sencillas.
 Eficiente para el acceso a una arista dada O(1).

Inconvenientes
 El principal, es que se necesita un espacio de O(n2)
aunque el grafo tenga muy pocas aristas.
 El número de nodos del grafo no puede cambiar.
 Requiere conocer por adelantado la cantidad de
nodos del grafo.

Grafos Estructura de Datos 2019 31

16
Lista de adyacencia
 En esta estructura de datos la idea es asociar a cada vértice i
del grafo una lista que contenga todos aquellos vértices j que
sean adyacentes a él.

 De esta forma sólo reservará memoria para los arcos


adyacentes a i y no para todos los posibles arcos que pudieran
tener como origen i.

 El grafo se representa por un vector de n componentes.

 En caso de que el grafo sea etiquetado, habrá que añadir un


segundo campo para mostrar el valor de la etiqueta.

Grafos Estructura de Datos 2019 32

Lista de adyacencia
 Ejemplo grafo dirigido y no dirigido

Grafos Estructura de Datos 2019 33

17
Lista de adyacencia
 Ventajas
 Útil cuando un grafo tiene muchos vértices y
pocas aristas/arcos.
 Desventajas
 Representación más compleja.
 Es ineficiente para encontrar las aristas que llegan
a un nodo.
 Puede llevar un tiempo O(n) determinar si existe
un arco del vértice i al vértice j, ya que puede
haber n vertices en la lista de adyacencia asociada
al vértice i.

Grafos Estructura de Datos 2019 34

Lista de adyacencia
 La implementación básica para un grafo dirigido es la siguiente:
public class Graph { private int getVertexOrder(Object element) {
private Vertex[] vertices; int position=0, order=-1;
private int vertexPosition; boolean found=false;
private int vertexQuantity; while(position<vertexQuantity & found==false) {
if(vertices[position].getElement().equals(element)) {
Graph(int quantity) { found=true;
vertexQuantity=quantity; order=position;
vertices=new Vertex[vertexQuantity]; }
vertexPosition=0; position++;
} }
public void insertVertex(Object element) { return order;
vertices[vertexPosition]=new Vertex(); } // fin clase Graph
vertices[vertexPosition].setElement(element);
vertexPosition++;
}
public void insertEdge(Object originElement, Object finishElement) {
int originPosition=getVertexOrder(originElement);
Edge edge=vertices[originPosition].getEdge();
Edge newEdge=new Edge();
newEdge.setPosition(getVertexOrder(finishElement));
if(edge==null)
vertices[originPosition].setEdge(newEdge);
else {
while(edge.getEdge()!=null)
edge=edge.getEdge();
edge.setEdge(newEdge);
}
}
Grafos Estructura de Datos 2019 35

18
Lista de adyacencia
 La implementación básica para un grafo dirigido (continúa):

public class Vertex { public class Edge {


private Object element; private int position;
private Edge edge; private Edge edge;
Edge() {
Vertex() { position=0;
element=null; edge=null;
edge=null; }
}
public Object getElement() { public int getPosition() {
return element; return position;
} }
public Edge getEdge() {
public Edge getEdge() { return edge;
return edge; }
} public void setPosition(int position) {
this.position=position;
public void setElement(Object element) { }
this.element=element;
} public void setEdge(Edge edge) {
This.edge=edge;
public void setEdge(Edge edge) { }
this.edge=edge; }
}
}

Grafos Estructura de Datos 2019 36

Operaciones sobre Grafos

Recorridos

19
Recorridos
 La operación de recorrer un grafo consiste
 En comenzar de un vértice determinado, y
 visitar todos aquellos vértices que son accesibles desde él en
un determinado orden.
 Se siguen dos estrategias:
 el recorrido en profundidad (DFS: Depth First Search):
 Equivalente a un recorrido en preorden de un árbol
 recorrido en anchura (BFS: Breadh First Search).
 Equivalente a recorrer un árbol por niveles
 El recorrido puede ser tanto para grafos dirigidos
como no dirigidos.
 Es necesario llevar una cuenta de los nodos visitados
y no visitados.

Grafos Estructura de Datos 2019 38

Recorrido en profundidad
 Estrategia que emplea: primero visita los hijos y
luego los hermanos.
1. Visitar nodo
2. Seleccionar adyacente no visitado
3. Recorrer en profundidad el nodo no visitado
4. Volver al punto 2
 Es similar al recorrido preorden de los árboles.
 Suponemos la existencia de un conjunto (visitados)
para ir almacenando los vértices del grafo visitados.
 En principio el conjunto de vértices visitados estará
vacío.
 Se implementa mediante recursividad (pila).

Grafos Estructura de Datos 2019 39

20
Recorrido en profundidad
 La implementación del algoritmo es la siguiente:

public void depthFirstSearch(Object element) {


Vector visited=new Vector(vertexQuantity);
depthFirst(getVertexOrder(element), visited);
}

private void depthFirst(int element, Vector visited) {


System.out.print(vertices[element].getElement()+" ");
visited.addElement(new Integer(element));
Enumeration adjs=adjacents(new Integer(element));
while(adjs.hasMoreElements()) {
Integer adjsOther=(Integer)adjs.nextElement();
if(!visited.contains(adjsOther))
depthFirst(adjsOther.intValue(),
visited);
}
}

Grafos Estructura de Datos 2019 40

Recorrido en profundidad
 Ejemplo: Se Muestra:

D C R H T A B

Pila
B
A D
H
T
C H
R
C
A
T D
B
R

Grafos Estructura de Datos 2019 41

21
Recorrido en profundidad
 Complejidades
 Matrices de adyacencias:
 Caso mejor O(n)
 Caso peor O(n²)
 Lista de adyacencias
 Caso mejor: O(1)
 Caso peor : O(n²)

Grafos Estructura de Datos 2019 42

Recorrido en anchura
 Estrategia que emplea:
 Primero visita los hermanos y luego los hijos.
 Pasos:
 Primero se visita nodo v.
 Luego se visitan todos sus adyacentes. (hermanos)
 Luego los adyacentes de estos (hijos) y así sucesivamente.
 El algoritmo utiliza una cola de vértices.
 Se utiliza un conjunto (visitados) para ir almacenando los
vértices del grafo por los que se va pasando.
 En una cola se mantienen los vértices adyacentes que se han
obtenido a partir de los vértices visitados y cuyos adyacentes
aún restan por explorar.
 Operaciones básicas:
 Sacar un nodo de la cola.
 Añadir a la cola sus adyacentes no visitados.

Grafos Estructura de Datos 2019 43

22
Recorrido en anchura
 La implementación del algoritmo es la siguiente:
public void breadhFirstSearch(Object element) {
breadhFirst(getVertexOrder(element));
}
private void breadhFirst(int element) {
Vector visited=new Vector(vertexQuantity);
Queue explore=new Queue();
explore.insert(new Integer(element));
visited.addElement(new Integer(element));
do {
Integer vertexOther=(Integer)explore.delete();
System.out.print(vertices[vertexOther.intValue()].getElement()+" ");
Enumeration adjs=adjacents(vertexOther);
while(adjs.hasMoreElements()) {
Integer adjsOther=(Integer)adjs.nextElement();
if(!visited.contains(adjsOther)) {
explore.insert(adjsOther);
visited.addElement(adjsOther);
}
}
} while(!explore.isEmpty());
}

Grafos Estructura de Datos 2019 44

Recorrido en anchura
 Ejemplo:

B Se Muestra:
A D D B C H R A T
H
C
T
R

Cola
D
H
R
B
C
A
T H
R
C
T
A T

Grafos Estructura de Datos 2019 45

23
Recorrido en anchura
 Para ambos recorridos será necesario el método adyacentes
(para lista de adyacencia).

private Enumeration adjacents(Integer element) {


Vector vertices=new Vector();
Edge position=vertices[element.intValue()].getEdge();

while(position != null) {
vertices.addElement(new Integer(position.getPosition()));
position=position.getEdge();
}
return vertices.elements();
}

Grafos Estructura de Datos 2019 46

Recorrido en anchura
 Complejidades
 Matrices de adyacencias
 Caso mejor O(n)
 Caso peor O(n²)
 Lista de adyacencias
 Caso mejor O(1)
 Caso peor O(n²)

Grafos Estructura de Datos 2019 47

24
Consultas…

Grafos Estructura de Datos 2019 48

Próximas clases
 1er. parcial:
 Miércoles 9/10
 Clase de teoría:
 Tema: Grafos (continuación)
 Fecha: Viernes 11/10 de 17 a 18.30 hs.
 Clases prácticas:
 Viernes 11/10 de 18.30 a 20 hs.

Grafos Estructura de Datos 2019 49

25

También podría gustarte