Cómo reducir los componentes fuertemente conectados en nodos únicos de manera eficiente si estoy usando una representación de lista de adyacencia

Algoritmo para condensar el gráfico:

Paso 1:

Realice dfs normales en el gráfico dado y almacene el número de nodo en una pila de acuerdo con su tiempo de visita. Este dfs es similar a la ordenación topológica. De esta manera, el nodo con el mayor tiempo de finalización estará en la parte superior de la pila.

// adjList [] representa la lista de adyacencia del gráfico dado
apilar st;

dfs nulo (ll start, vector adjList [], vector y visitado)
{
visitado [inicio] = verdadero;
for (ll i = 0; i <adjList [start] .size (); i ++)
{
ll vértice = adjList [inicio] [i];
if (visitado [vértice] == falso)
{
dfs (vértice, adjList, n_visited);
}
}
st.push (inicio);
}

Paso 2:

Realice otra operación dfs para un componente fuertemente conectado y almacene los nodos de un componente fuertemente conectado particular en un nuevo vector llamado gr.

// r_adjList: representa la lista de adyacencia del gráfico invertido
// scc_visited -visited vector requerido para dfs
// grupo – representa el componente fuertemente conectado
// gr- este vector guarda los nodos en un componente particular fuertemente conectado
// parent []: guarda el grupo no para el nodo, es decir, guarda el representante de // nodo en un componente fuertemente conectado

ll grupo;
vector gr;
ll padre [MAX_LENGTH] = {0};

voc scc_dfs (ll start, vector r_adjList [], vector & scc_visited)
{
scc_visited [inicio] = verdadero;
para (ll i = 0; i <r_adjList [inicio] .size (); i ++)
{
ll vértice = r_adjList [inicio] [i];
if (scc_visited [vértice] == falso)
{
scc_dfs (vértice, r_adjList, scc_visited);
}
}
gr [grupo] .pb (inicio);
padre [inicio] = grupo;
}

Paso 3:

Esta es la parte principal de reducir el gráfico.

Nuevamente, haga el recorrido dfs, y para cada nodo adyacente u de un nodo particular v, compruebe que si ese nodo u es parte del mismo componente fuertemente conectado que el de v. Es decir, compruebe si u y v pertenecen al mismo fuertemente conectado componente. Si es así, no agregue ningún borde, de lo contrario agregue el borde entre los dos nodos u y v

// visitado [] – es un vector visitado requerido para el recorrido dfs
// adjList_new []: guarda la nueva lista de adyacencia para el gráfico condensado
// adjList [] – antigua lista de adyacencia

void condense_graph_dfs (ll start, vector adjList [], vector adjList_new [], vector y visitado)
{
visitado [inicio] = verdadero;
for (ll i = 0; i <adjList [start] .size (); i ++)
{
ll vértice = adjList [inicio] [i];
ll p_start = padre [inicio];
ll p_vertex = padre [vértice];
if (p_start == p_vertex)
{
continuar;
}
más
{
adjList_new [p_start] .pb (p_vertex);
}
if (visitado [vértice] == falso)
condense_graph_dfs (vértice, adjList, adjList_new, visitado);
}
}

Después de realizar condense_graph_dfs, obtiene la nueva lista de adyacencia para el gráfico condensado donde los nodos son el grupo no asignado durante la operación dfs del componente fuertemente conectado. Espero que esto deje en claro reducir los componentes fuertemente conectados en nodos únicos en el gráfico.

para cada scc, elija un vértice representativo al azar. Itere la relación de adyacencia y asigne cada borde a un borde entre los representantes de los sccs de los puntos finales. Evite generar duplicados y elimine los bordes originales a medida que avanza. Dependiendo de la aplicación, es posible que no desee crear bucles (por ejemplo, mantener los bordes dentro de un scc). Puede ser más eficiente no alterar el gráfico in situ sino crear uno nuevo. Para obtener sugerencias más detalladas, debe nombrar su entorno de programación y tal vez suministrar ejemplos de código.

More Interesting

¿BFS es más rápido y más eficiente que DFS?

¿Cuántos casos hay para reequilibrar los árboles AVL?

Cómo implementar un código C para la eliminación de un nodo de una lista vinculada considerando todos los casos de prueba

¿Qué es mejor entre la búsqueda binaria y el árbol de búsqueda binaria para buscar?

¿Cuál es el mejor algoritmo para encontrar si 3 números son coprimos? ¿Como funciona?

¿Cuál es el algoritmo más difícil que has implementado? ¿Por qué fue difícil? ¿Cuánto tiempo te llevó?

¿Cuál es el problema de programación más difícil que haya resuelto?

¿Qué significa Yoshua Bengio que la principal limitación de los algoritmos de aprendizaje automático actuales es que necesitan demasiados datos para aprender?

¿Qué es un árbol de recursión?

Preguntado por un no experto en tecnología, ¿qué tan impactante sería si una tecnología pudiera mitigar el ruido impulsivo en tiempo real usando un algoritmo no lineal simple que usa la mediana (en lugar de la media)? Por ejemplo, podría usarse para reemplazar filtros lineales analógicos en teléfonos móviles, esencialmente actuando como un filtro lineal a menos que detecte ruido impulsivo y actúe para condicionarlo.

¿Cuáles son las formas de ajustar algoritmos de aprendizaje automático?

Cómo hacer un robot que pueda resolver un laberinto de líneas

¿Es la clave de una matriz asociativa una variable?

¿Cuáles son algunas características de los datos de imágenes faciales que se pueden utilizar para alimentar los algoritmos de aprendizaje automático?

¿Cuál es el mejor camino para dominar el aprendizaje profundo?