¿Qué es un algoritmo para convertir de una matriz de adyacencia a listas de adyacencia?

Atraviesa la matriz y mientras atraviesas
Por cada 1 encontrado, agregue un nodo que contenga la columna no.
de la celda a la cabeza del nodo que representa la fila no.
la celda donde encontraste esto 1.

La complejidad temporal de este algoritmo es [matemática] O (n ^ 2) [/ matemática] a medida que atraviesa la matriz. También te estoy proporcionando un esquema aproximado del código:

list_ptr * matToList (int mat [] [], int r, int c)
{
list_ptr * var;
// Obtenga memoria para la var aquí.
para (int i = 0; i <r; i ++)
para (int j = 0; j <c; j ++)
si (mat [i] [j])
addNode (list_ptr [i], j); // Escribe esto () tu mismo
// agrega un nodo de j en el nodo principal de i
volver var;
}

Si el gráfico no está dirigido, puede atravesar la mitad superior de la diagonal principal de la matriz, pero tendrá que usar [math] addNode () [/ math] dos veces. (¿Piensa por qué?)

No estoy seguro de si existe un algoritmo específico. Aquí está el ingenuo:

adjList = lista de adyacencia
Para cada fila i de la matriz:
Para cada columna j en la fila i:
if [math] \ textit {matrix} _ {ij} = 1 [/ math]
[matemáticas] \ textit {adjList} _ {i} .append (j) [/ math]

Puede hacerlo en tiempo lineal simplemente escaneando y agregando listas a medida que avanza. La solución ingenua es la más rápida, creo.

Una matriz de adyacencia en uno de los formatos de matriz dispersos ES una lista de adyacencia 🙂