tema 5 grafos. implementación (i).. implementación de grafos: matriz de adyacencias
TRANSCRIPT
![Page 1: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/1.jpg)
Tema 5 Grafos.Implementación (I).
![Page 2: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/2.jpg)
Implementación de Grafos: Matriz de Adyacencias
![Page 3: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/3.jpg)
Matriz de adyacenciasTabla bidimensional que guarda las
adyacencias entre pares de vértices de un grafo.
Vértices: enteros en el conjunto {0,1,…,n-1}
Aristas: pares de tales enteros. Cada fila y cada columna representan un
vértice del grafo y cada posición representa una arista (o la ausencia de esta) cuyo vértice origen se encuentra en la fila y vértice final se encuentra en la columna.
![Page 4: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/4.jpg)
Ejemplos
a b
c d
e
a b c d e
a 0 1 0 0 0
b 0 0 0 0 0
c 1 0 0 1 0
d 1 1 0 0 0
e 0 1 0 1 1
a b
c d
e
a b c d e
a 0 1 1 1 0
b 1 0 0 0 1
c 1 0 0 1 0
d 1 0 1 0 0
e 0 1 0 0 0
Grafo dirigido Grafo no dirigido
matriz simétrica
![Page 5: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/5.jpg)
Representación en matriz de adyacenciasLos vértices se representan mediante índices.
a b
c d
eVértices: a b c d e
Índices: 0 1 2 3 4
Matriz de adyacencias se implementa como un vector A bidimensional de n x n donde:La celda [i, j] guarda información referente a la arista
(v, w) donde v es el vértice con índice i y w es el vértice con índice j.
Para grafos no etiquetados, las celdas guardan valores booleanos: true: existe la arista false: no existe la arista
![Page 6: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/6.jpg)
Clase GrafoMA en JAVAGrafos simples,
dirigidos o no dirigidos, no etiquetados
public class GrafoMA implements Grafo {boolean dirigido; int maxNodos; int numVertices; boolean matrizAdy[ ][ ];
}
public GrafoMA (boolean d) {maxNodos = numVertices = 0;dirigido = d;
}public GrafoMA (int n, boolean d) {
dirigido = d; maxNodos = n;numVertices = 0;matrizAdy = new boolean[n][n];}
}
Dos constructores: grafo vacío y grafo de tamaño n.
![Page 7: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/7.jpg)
Insertar aristasLa inserción de una arista (i, j) en la matriz
supone asignar a la celda correspondiente el valor true.En grafo dirigido:
las filas representan el vértice origen (i) las columnas representan el vértice destino (j)
En grafo no dirigido: La arista (i,j) es igual a la arista (j,i) (para que la matriz
mantenga la propiedad de la simetría.
public void insertaArista (int i, int j) {matrizAdy [i] [j] = true;if (!dirigido)
matrizAdy [j] [i] = matrizAdy [i] [j]; }
![Page 8: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/8.jpg)
Eliminar aristas
public void eliminarArista (int i, int j) {matrizAdy [i] [j] = false;if (!dirigido)
matrizAdy [j] [i] = false; }
La eliminación de una arista (i, j) en la matriz supone asignar a la celda correspondiente el valor false.
![Page 9: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/9.jpg)
Insertar vértices El tratamiento de los vértices implicaría
modificar el tamaño de la tabla (o modificar los índices en caso de querer eliminar un vértice):
Simplificación del método: No se permite añadir vértices si se supera el
tamaño máximo del grafo (valor del campo maxNodos).
Si el número de nodos es menor al tamaño máximo, se asigna el valor false a las celdas correspondientes y se actualiza el campo numVertices
![Page 10: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/10.jpg)
Insertar vértices
public void insertaVertice (int n) {if ( n > maxNodos - numVertices )
System.out.println ("Error, se supera el número de nodos máximo");else {
for (int i = 0; i < numVertices + n; i++) {for (int j = numVertices; j < numVertices + n; j++)
matrizAdy [i] [j] = matrizAdy [j] [i] = false;}
numVertices = numVertices + n;}
}
Método que inserta n vértices en la tabla si existe espacio para ellos:
![Page 11: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/11.jpg)
Grado de salida y entrada de un vértice (I)Grado de salida:
Dado que las filas representan los vértices origen, el grado de salida de un vértice i es el valor de la suma de la fila i.
Grado de entrada:Dado que las columnas
representan los vértices destino, el grado de entrada de un vértice j es el valor de la suma de la columna j.
a b
c d
e
a b c d e
a 0 1 0 0 0
b 0 0 0 0 0
c 1 0 0 1 0
d 1 1 0 0 0
e 0 1 0 1 1
Grado de entrada (a)= 2
Grado de salida (a) = 1
![Page 12: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/12.jpg)
Grado de salida y entrada de un vértice (II)public int gradoIn (int x) { int gIn = 0; for (int i = 0; i < numVertices; i++) //recorrido por filas
if (matrizAdy [i] [x]) //manteniendo la posición de la columna en [ x ] gIn++; return gIn;}
public int gradoOut (int x) { int gOut = 0; for (int j = 0; j < numVertices; j++) //recorrido por columnas
if (matrizAdy [x] [j]) // manteniendo la posición de la fila en [ x ] gOut++;
return gOut;}
![Page 13: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/13.jpg)
Incidencia de un vértice y tamaño del grafo
public int incidencia (int i) { if (!dirigido) return gradoIn (i); else return gradoIn (i) + gradoOut (i); }
Incidencia: Grafo no dirigido: la
incidencia de un vértice viene dada por su grado de entrada
Grafo dirigido: grado de entrada + grado de salida
Tamaño: Definido por el número
de aristas. Si el grafo es no dirigido, las aristas se cuentan dos veces, luego se ha de dividir entre dos el número de aristas contadas.
public int tamano () { int tm = 0; for (int I = 0; I < numVertices; i++) for (int j =0; j < numVertices; j++) if (matrizAdy [i] [j])
tm++; if (dirigido) return tm; else return tm/2;}
![Page 14: Tema 5 Grafos. Implementación (I).. Implementación de Grafos: Matriz de Adyacencias](https://reader033.vdocument.in/reader033/viewer/2022061300/54d47da2497959a0198b5313/html5/thumbnails/14.jpg)
Método que comprueba si un grafo es dirigidoPara comprobar si un grafo es dirigido o no,
basta con comprobar si se trata de una matriz simétrica, donde la posición [i, j] = [j, i].
public boolean esDirigido (Grafo g) { boolean dir = true; for (int I = 0; I < numVertices; i++)
for (int j = 0; j < numVertices; j++) if (matrizAdy [i] [j] != matrizAdy [j] [i])
dir = false; return dir;}