Ruta de existencia entre n pares de nodos

8

Dado un gráfico acíclico dirigido con nodos, ¿cómo se puede determinar si hay una ruta entre alguno de los siguientes n pares de nodos ? Hay un algoritmo simple en (donde m es el número de aristas) haciendo una búsqueda desde cada nodo , pero ¿se puede hacer mejor?2nO ( n ( n + m ) ) 1 n(1n+1),,(nn+n)O(n(n+m))1n

EDITAR: Estoy buscando existencia, no caminos completos.

Alexandru
fuente
No está del todo claro lo que está preguntando. ¿Está buscando un solo camino que contenga los bordes que menciona? ¿O estás buscando múltiples caminos?
Dave Clarke
2
@Dave: Está buscando el OR de un pequeño trozo de la matriz de cierre transitivo.
Radu GRIGore
1
@Alexandru, 1-> 4, 2-> 3. Agregas 3-> 1, 4-> 2.
Radu GRIGore
66
Puede calcular el cierre transitivo a través de una multiplicación de matriz rápida que sería mejor que el tiempo O (nm) si m es grande.
Chandra Chekuri
44
@alexandru: eso no es lo que hizo su pregunta, para ser justos. Usted estaba pidiendo un límite más rápido, implementaciones no prácticas (que es una pregunta válida, pero separada)
Suresh Venkat

Respuestas:

5

Como Chandra Chekuri señaló en un comentario, podría calcular el cierre transitivo a través de una multiplicación de matriz rápida, resolviendo el problema en tiempo O ( ) (use su método favorito, O ( n 2.376 ) a través de Coppersmith y Winograd, o más prácticamente usando Strassen's O ( n 2.81 )), y esto sería bueno para gráficos densos.nωn2.376n2.81

Ahora, afirmo que si puede superar este tiempo de ejecución para su problema de gráficos densos, obtendría un algoritmo para la detección de triángulos que es más eficiente que calcular el producto de dos matrices booleanas. La existencia de tal algoritmo es un gran problema abierto.

Reduciré el problema del triángulo al problema de n-pares-DAG-accesibilidad. Supongamos que se nos da un gráfico G en n nodos y queremos determinar si G contiene un triángulo.

Ahora, desde G cree un DAG G 'de la siguiente manera. Cree cuatro copias del conjunto de vértices, , V 2 , V 3 , V 4 . Para copias u iV i , v i + 1V i + 1 para i = 1 , 2 , 3 , agregue un borde ( u i , v i + 1 ) iff ( u , v )V1V2V3V4uiVivi+1Vi+1i=1,2,3(ui,vi+1)(u,v)estaba en G. Ahora bien, si nos preguntamos si existe un camino entre cualquiera de los pares para todos u G, entonces esto exactamente se pregunta si hay un triángulo en G . El gráfico actual tiene 4 n nodos y estamos preguntando acerca de n pares. Sin embargo, podemos agregar 2 n nodos ficticios aislados y tener 3 n consultas en su lugar (agregando una consulta para 2 n pares distintos ( y , d ) donde y V 2(u1,u4)uG4nn2n3n2n(y,d) y d un maniquí), obteniendo así un 6 n ejemplo -node de exactamente su problema.yV2V3d6n

virgi
fuente
0

La clasificación topológica ( ) luego se trabaja propagando un conjunto de bits de nodos desde el cual se puede alcanzar cada nodo ( O ( m n ) ).O(m+n)O(mn)

Después del ordenamiento topológico, puede hacer un rechazo rápido de (si el nodo n + x precede al nodo x en el ordenamiento, entonces no hay una ruta de x a n + x ).O(n)n+xxxn+x

Peter Taylor
fuente
Esto realmente no parece ser más rápido para mí. Si , entonces el algoritmo de la pregunta podría hacer un simple preprocesamiento respondiendo NO si hay un vértice aislado. m=o(n)
Serge Gaspers
1
¿Cómo es esto mejor que mi algoritmo básico?
Alexandru
@Alexandru, creo que es algo mejor porque contiene bits. Es decir, es donde w es el ancho de la palabra. No está claro si te interesan esas mejoras. O((m+n)n/w)w
Radu GRIGore
Es una compensación: utiliza O (n * n / w) memoria adicional en lugar de O (n).
Alexandru
@Alexandru, asintóticamente en el peor de los casos es lo mismo, pero el análisis de casos promedio es complicado, y lo que es mejor podría depender de las estadísticas de la estructura gráfica esperada.
Peter Taylor
0

O(N2)

yespath = array(1..N)       // output of the algorithm
                            // initially filled with false
processed = array(1..N)     // processed nodes

// HEURISTIC 1: some preprocessing
for every node u in 1..N
  if (no outbound edges from u) then processed[u] = true
  if (no inbound edges to u+N) then processed[u] = true

for each node u in [1..N]    // MAIN loop 
  if (not processed[u]) then
    collected = [u]          // a list that initially contains u
    visited = array(1..2*N)  // filled with zeroes        
    do a breadth first scan from u
       for each node v found in the search
         set visited[v] = distance from u
         if (v <= N) then add v to collected
    end do

    // HEURISTIC 2: useful collected info on other nodes <= N
    foreach node v in collected
      processed[v] = true
      if ( visited[ v + N ] > 0 and visited[v] < visited[v+N] ) then yespath[v] = true
    end foreach

  end if
end for // MAIN loop


O(N2)O(Nk)e>u+N

Se pueden agregar otras heurísticas, pero su eficiencia (y la eficiencia de las tres propuestas) depende en gran medida de la estructura del gráfico.

Marzio De Biasi
fuente