Está en la página 1de 7

Operaciones sobre grafos

Las operaciones básicas sobre grafos son las de comprobación de existencia de


arista entre dos vértices (o conocer su longitud, si el grafo es etiquetado), recorrer la
lista de vértices adyacentes a uno dado, la inserción y borrado de una arista, y la
inserción y borrado (junto con las aristas asociadas) de un vértice. En muchas
aplicaciones, sin embargo, el conjunto de vértices no varía durante la ejecución.
1. Búsqueda:
Suponga que queremos encontrar la posición POS de un nodo N de un grafo C .
Esto se puede llevar a cabo mediante el ejemplo siguiente, tal como sigue:
Llamar BUSCA(NODO, SIG, PRINCIPIO, N, POS)
O sea, que esta sentencia de llamada busca en la lista NODO el nodo N.

Ejemplo: Busca(INFO, ENL, PRINCIPIO, ITEM, POS) [Algoritmo 5.2] Busca la


posición POS del primer nodo que contiene a ITEM, o hace
POS : = NULO.

1.-Hacer PTR : =PRINCIPIO.


2.-Repetir mientras PTR sea diferente de NULO:
Si ITEM = INFO[PTR], entonces; Hacer POS :=
PTR y Volver.
Si no hacer PTR : = ENL
[PTR]. [Fin del Bucle].
3.-Hacer POS : = NULO y volver.

Por otro lado, suponga que queremos encontrar la posición POS de una arista (A
B) del grafo G. Primero debemos encontrar la posición POSA de A y la posición
POSB de B en la lista NODO. Luego debemos de buscar en la lista de
sucesores de A, que tiene el puntero de lista ADY[POSA], la posición POS de
POSB. Esto se implementa con el ejemplo siguiente, que también comprueba que
A y B sean nodos de G. Observe que POS de la posición de POSB en la lista
ARISTA.

Ejemplo: BUSCARISTA(NODO, SIG, ADY, PRINCIPIO, DEST, ENL, A, B,


POS)
Este procedimiento busca la posición POS de una arista (A,
B) del grafo G, o pone POS : = NULO
1.-Llamar BUSCA(NODO, SIG, PRINCIPIO, A, POSA).
2.-Llamar BUSCA(NODO, SIG, PRINCIPIO, B, POSB).
3.-Si POSA: = NULO o POSB : = NULO, entonces:
Hacer POS : = NULO.
Si no: Llamar BUSCA (DEST, ENL, ADY[POSA], POSB, POS).
4.-Volver.
2. Inserción
Suponga que se va a insertar un nodo N en el grafo G. Observe que N será
asignado a NODO [NDISP], el primer nodo disponible. Mas aún, como N será un
nodo aislado, se debe hacer ADY[NDISP]: = NULO. El ejemplo mostrado hace
esto mediante una variable lógica INDIC que indica si hay desbordamiento.

Por supuesto, en el ejemplo siguiente debe ser modificado si la lista NODO se


mantiene como una lista ordenada o como un árbol binario de búsqueda.

Procedimiento 1 : INSNODO(NODO, SIG, ADY, PRINCIPIO, NDISP, N, INDIC)


Este procedimiento inserta el nodo N en le grafo G.

1.-[¿DESBORDAMIENTO?] Si NDISP= NULO, entonces: Hacer


INDIC := FALSO y volver.
2.- Hacer ADY[NDISP] : = NULO.
3.-[Quitar el nodo de la lista NDISP].
Hacer NUEVO: =NDISP y NDISP :=SIG[NDISP].
4.-[Insertar nodo N en la lista NODO].
Hacer NODO[NUEVO] : = N, SIG[NUEVO] :=PRINCIPIO y
PRINCIPIO : = NUEVO.
5.-Hacer INDIC := VERDADERO y Vol

Suponga que se va a insertar una arista (A, B) en el grafo G (El procedimiento


asumirá que tanto A como B son nodos de G). El procedimiento busca la posición
POSA de A y la posición POSB de B en la lista NODO. Luego se inserta(A, B)
como una arista de G insertando POSB en la lista de sucesores de A, que tiene el
puntero de la lista ADY[POSA]. De nuevo se usa una variable lógica INDIC para
indicar el desbordamiento.

El procedimiento es el siguiente:

Procedimiento 2.- INSARISTA(NODO, SIG, ADY, PRINCIPIO, DEST, ENL,


ADISP, A, B, INDIC)

Este procedimiento inserta la arista (A, B) en el grafo G

1.-Llamar BUSCA(NODO, SIG, PRINCIPIO, A, POSA)


2.- Llamar BUSCA(NODO, SIG, PRINCIPIO, B, POSB)
3.- [¿DESBORDAMIENTO?] Si ADISP = NULO, entonces:
Hacer INDIC := FALSO y Volver.
4.- [Eliminar nodo de la lista ADISP]. Hacer NUEVO: = ADISP y
ADISP ; = ENL[ADISP]
5.-[Insertar POSB en la lista de sucesores de A ].
Hacer DEST[NUEVO]: = POSB,
ENL[NUEVO]: = ADY[POSA] y ADY[POSA]: = NUEVO.
6.-Hacer INDIC : = VERDADERO y Volver.
3. Eliminación

Suponga que se va a eliminar una arista (A, B) del grafo G. (Nuestro


procedimiento asumirá que A y B son nodos de G). Debemos encontrar primero
la posición POSA de A y la posición POSB de B en la lista de nodos. Entonces
simplemente eliminamos POSB de la lista de sucesores de A, que tiene el
puntero de la lista ADY[POSA]. Se usa una variable INDIC lógica para indicar si
no existe tal arista en el grafo G. El procedimiento es el siguiente:

Procedimiento ELIMARISTA (NODO, SIG, ADY, PRINCIPIO, DEST,


ENL, ADISP, A, B, INDIC).

Este procedimiento elimina la arista (A, B) del grafo G .

1.-Llamar BUSCA (NODO, SIG, PRINCIPIO, A, POSA) [Localizar


Nodo A].
2.- Llamar BUSCA (NODO, SIG, PRINCIPIO, B, POSB) [Localizar
Nodo B].
3.-Llamar ELIMINAR (DEST, ENL, ADY[POSA], ADISP, POSB,
INDIC).
4.-Volver.

Si va a eliminar un nodo N del grafo G. Esta operación es más complicada que las
operaciones de búsqueda e inserción y que la de eliminar una arista, ya que debemos
eliminar todas las aristas que contengan a N. Note que esas aristas son de dos tipos;
aquellas que empiezan en N y aquellas que terminan en N. Así nuestro procedimiento
consistirá fundamentalmente en los siguientes cuatro pasos:
1. - Encontrar la posición POS del nodo N en G.
2. - Eliminar todas las aristas que terminen en N; o sea, eliminar POS de la lista
de sucesores de cada nodo M de G (este paso requiere recorrer la lista de
nodos de G).
3. - Eliminar todas las aristas que empiecen en N. Esto se hace encontrando la
posición COM del primer sucesor y la posición FIN del ultimo sucesor de N, y
luego añadiendo la lista de sucesores de N a la lista ADISP.
4. - Eliminar el nodo N mismo de la lista de NODO.
El procedimiento es el siguiente:

Procedimiento ELIMNODO(NODO, SIG, ADY, PRINCIPIO, NDISP, DEST,


ENL, ADISP, N, INDIC).
Este procedimiento elimina el nodo N del grafo G.
1.- Llamar BUSCA (NODO, SIG, PRINCIPIO, N, POS).[Localizar el
nodo N ].
2.- Si POS = NULO, entonces : Hacer INDIC ) : = FALSO y
volver. 3.- [Eliminar aristas que terminan en N].
(a).- Hacer PTR : =PRINCIPIO.
(b).- Repetir mientras PTR se a diferente de NULO :
(i).- Llamar ELIMINAR (DEST, ENL, ADY,[PTR],
ADISP, POS, INDIC).
(ii).- Hacer PTR := SIG[PTR].
[Fin del Bucle].
4.- [¿Lista de sucesores vacía?] Si ADY[POS]= NULO,
entonces : Ir al paso 7.
5.-[Encontrar primer y ultimo sucesor de N].
6.-[Añadir lista de sucesores de N a la lista ADISP].
Hacer ENL[FIN] :=ADISP y ADISP := COM.
7.-[Eliminar N ].
Llamar ELIMINAR(NODO, SIG, PRINCIPIO, NDISP,
N, INDIC).
8.- Volver.
Recorridos de un grafo:
La operación de recorrer una estructura de datos consiste en visitar (procesar) cada
uno de los nodos a partir de uno dado. Así, para recorrer un árbol se parte del nodo
raíz y según el orden se visitan todos los nodos. De igual forma, recorrer un grafo
consiste en visitar todos los vértices alcanzables a partir de uno dado. Hay dos formas
de recorrer un grafo: recorrido en profundidad y recorrido en anchura. Si el
conjunto de nodos marcados se trata como una cola, entonces el recorrido es en
anchura; si se trata como una pila, el recorrido es en profundidad.
4. Recorrido en Anchura:
El recorrido de búsqueda en anchura, en amplitud o expansión, es una estrategia
aplicable indistintamente al caso de grafos dirigidos y no dirigidos. El recorrido en
anchura es una generalización del recorrido por niveles de un árbol.
Se trata de visitar un nodo inicial y luego a todos los nodos que están a un arco de
distancia de éste, luego a todos los nodos que están a dos arcos de distancia de éste
y así sucesivamente, hasta alcanzar a todos los nodos a los que se pueda llegar
desde el nodo inicial. Una aplicación típica de este recorrido es la resolución de
problemas de planificación.
La búsqueda en amplitud se puede utilizar para hallar la distancia más corta entre
algún nodo inicial y los nodos restantes del grafo. Esta distancia más corta es el
mínimo número de aristas que hay que recorrer para pasar desde el nodo inicial hasta
el nodo concreto que se esté examinando.
Comenzando en el nodo “s”, esta distancia se calcula examinando todas las aristas
incidentes en el nodo “s”, y pasando después a un nodo adyacente “w”, repitiéndose
entonces todo el proceso. El recorrido continúa hasta que se hayan examinado todos
los nodos del grafo. En una búsqueda en amplitud, cada nodo se visita o es
procesado en algún sentido, dependiendo de la aplicación concreta. La búsqueda
comienza en un nodo concreto del grafo.
A continuación, la búsqueda se extiende a los nodos del grafo que estén más
próximos al nodo inicial antes de visitar ningún otro. Estos nodos están relacionados
de alguna forma con el nodo especificado, y forman parte de un grupo que depende
de la aplicación concreta. Inicialmente, se visitan todos aquellos nodos que sean
adyacentes al nodo inicial. A continuación, se visitan todos los nodos que estén a una
distancia “2” del nodo inicial. Este proceso se repite hasta que se haya visitado todos
los nodos posibles. Sin embargo, este enfoque de búsqueda puede dar lugar a
problemas. Los nodos ya visitados no deben visitarse de nuevo. Se puede evitar esta
situación marcando aquellos nodos que se hayan visitado. Si un nodo ya ha sido
marcado con anterioridad (esto es, si ya ha sido alcanzado o visitado), nunca vuelve a
ser visitado. Este método utiliza una cola como estructura auxiliar en la que se
mantienen los vértices que se vayan a procesar posteriormente.
El recorrido en anchura trabaja de la siguiente manera:
 Se visita el nodo inicial.
 Después de visitar el nodo inicial se visitan todos los sucesores.
 Después los sucesores de los sucesores.
 Se repiten los pasos 1 y 2 hasta encontrar un nodo sin arcos salientes o ya
visitados.
 Si después de visitar todos los descendientes del primer nodo, todavía
quedan más nodos por visitar, se repite el proceso reiniciando.

También podría gustarte