Tema 5 Grafos. Implementación (II)

15
Tema 5 Grafos. Implementación (II)

description

Tema 5 Grafos. Implementación (II). Listas de Adyacencias. Lista de adyacencias. En una lista de adyacencias, a cada vértice i se le asocia una lista enlazada con todos los vértices j adyacentes a i . Sólo se reserva memoria para las aristas adyacentes a i . - PowerPoint PPT Presentation

Transcript of Tema 5 Grafos. Implementación (II)

Page 1: Tema 5 Grafos. Implementación (II)

Tema 5 Grafos.Implementación (II)

Page 2: Tema 5 Grafos. Implementación (II)

Listas de Adyacencias

Page 3: Tema 5 Grafos. Implementación (II)

Lista de adyacenciasEn una lista de adyacencias, a cada vértice i se le asocia

una lista enlazada con todos los vértices j adyacentes a i.

Sólo se reserva memoria para las aristas adyacentes a i. El grafo se representa por medio de un vector de n

componentes, (n = número de vértices del grafo) donde cada componente constituye la lista de adyacencias correspondiente a cada vértice del grafo.

Cada nodo de la lista consta de un campo indicando el vértice adyacente.

Si el grafo fuese etiquetado o valorado, habría que añadir un segundo campo para mostrar el valor de la etiqueta o el peso de la arista.

Page 4: Tema 5 Grafos. Implementación (II)

Ejemplo

1

0 1

2 3

4

null0

1

2

3

4

0

null

3 null

0 1 null

3 4 null1

Page 5: Tema 5 Grafos. Implementación (II)

Representación en lista 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

Lista de adyacencias se implementa como un vector A de tamaño n:Cada componente i contiene la lista de nodos adyacentes

al vértice i. Cada nodo de la lista guarda información sobre índice del

vértice.Uso de una Lista Calificada Ordenada.

Page 6: Tema 5 Grafos. Implementación (II)

Clases NodoLista y Lista

public class NodoLista {public int clave;public NodoLista sig;

}public class Lista {

public NodoLista inicio;}

Métodos utilizados:

void insertar (int x) ;void eliminar (int x);boolean busqueda (int x);

Page 7: Tema 5 Grafos. Implementación (II)

Clase GrafoLA en JAVAGrafos simples,

dirigidos o no dirigidos, no etiquetados

public class GrafoLA implements Grafo {boolean dirigido; int maxNodos; int numVertices; Lista listaAdy [ ];

}

public GrafoLA (boolean d) {maxNodos = numVertices = 0;dirigido = d;

}public GrafoLA (int n, boolean d) {

dirigido = d; maxNodos = n;numVertices = 0;listaAdy = new Lista [n];

}

Dos constructores: grafo vacío y grafo de tamaño n.

Page 8: Tema 5 Grafos. Implementación (II)

Insertar aristasLa inserción de una arista (i, j) en la lista de

adyacencias supone insertar un nodo con clave j en la lista con índice i.

Si el grafo es no dirigido: arista (i, j) = arista (j, i) Hay que insertar en la lista con índice j el nodo con clave i.

public void insertaArista (int i, int j) {if ( i >= numVertices ) System.out.println ("Error, no existe el vértice en el grafo");else {

listaAdy [i].insertar (j);if (!dirigido)

listaAdy [j].insertar (i);}

}

Page 9: Tema 5 Grafos. Implementación (II)

Eliminar aristasLa eliminación de una arista (i, j) consiste en

eliminar el nodo con clave j de la lista con índice i. Si el grafo es no dirigido, habrá que eliminar el

nodo con clave i de la lista con índice j:

public void eliminaArista (int i, int j) {if (j >= numVertices)

System.out.println ("Error, no existe el vértice en el grafo");else {

listaAdy[i].eliminar (j);if (!dirigido)

listaAdy[j].eliminar (i);}

}

Page 10: Tema 5 Grafos. Implementación (II)

Insertar vértices No se permite insertar vértices si se supera el límite de

vértices del grafo (valor del campo maxNodos). El método insertarVertices tiene como argumento un entero

que indica el número de vértices que se desea añadir al grafo. Si no se supera el número máximo de nodos del grafo, se

inicializan las n listas correspondientes a los vértices que se añaden al grafo

Se actualiza el campo numVertices del grafo.

public void insertaVertice (int n) { if ( n > maxNodos - numVertices ) System.out.println("Error, se supera el número de nodos máximo del grafo"); else { for (int i = numVertices; i < numVertices + n; i++) listaAdy [i] = new Lista (); } numVertices += n;}

Page 11: Tema 5 Grafos. Implementación (II)

Grado de salida y entrada de un vértice (I)Grado de salida de v:

Número de elementos de la lista de adyacencia de v.Grado de entrada de v:

Número de veces que aparece v en las distintas listas de adyacencia.

a b

c d

e Grado de entrada (a)= 2

Grado de salida (a) = 1b nulla

b

c

d

e

a

null

d null

a b null

b e nullb

Page 12: Tema 5 Grafos. Implementación (II)

Grado de salida y entrada de un vértice (II)

public int gradoIn (int v) { int gIn = 0; for (int i = 0; i < numVertices; i++)

if (i != v) if (listaAdy [i].busqueda (v)) gIn++; return gIn;

}

public int gradoOut (int i) { //contar los elementos de la lista int gOut = 0; NodoLista aux = listaAdy[i].inicio; while (aux != null){ gOut++; aux = aux.clave; } return gOut;}

Page 13: Tema 5 Grafos. Implementación (II)

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: incidencia

= grado de entrada Grafo dirigido: grado de

entrada + grado de salidaTamaño:

Definido por el número de aristas (i.e., número de nodos de las distintas listas).

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.

Uso del método auxiliar numElems.

public int tamanno () { int tm = 0; for (int i = 0; i < numVertices; i++) { tm += numElementos (listaAdy [i]); } if (!dirigido) tm = tm/2; return tm;}static int numElementos (Lista lista) { NodoLista aux = lista.inicio; int resul = 0; while (aux != null) { resul += 1; aux = aux.sig; } return resul;}

Page 14: Tema 5 Grafos. Implementación (II)

Método que comprueba si un grafo es dirigidoEn un grafo dirigido: (i,j) ≠ (j,i)En un grafo no dirigido: (i,j)=(j,i). Para comprobar si se trata de un grafo dirigido, se

comprueba que, para cada par de vértices i,j, el vértice j se encuentra en la lista de adyacencias del vértice i; e igualmente que el vértice i se encuentra en la lista de adyacencias del vértice j.

public boolean esNoDirigido () { boolean dir = true; for (int i = 0; i < numVertices; i++) for (int j = 0; j < numVertices; j++){ if (listaAdy [i].busqueda (j) != listaAdy [j].busqueda (i)) dir = false; } return dir;}

Page 15: Tema 5 Grafos. Implementación (II)

Imprimir la lista de adyacenciaspublic void imprimirGrafo () { System.out.println ("Tamaño máximo del grafo: " + maxNodos + "\n"); System.out.println ("El grafo contiene " + numVertices + " vértices: \n"); for (int i = 0; i < numVertices; i++) { System.out.print ("vértice " + i + ": "); escribir (listaAdy [i]); }}static void escribir (Lista lista) { NodoLista aux; aux = lista.inicio; while (aux != null) { System.out.print (aux.clave +", "); aux = aux.sig; } System.out.println ("FIN");}