es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Dado un grafo dirigido G=(V,E) con un par de vértices s,t∈V, encuentra un algoritmo que encuentre todos los caminos únicos desde s hasta t.

Dado un grafo dirigido G=(V, E) con un par de vértices s,t∈V, Encuentra un algoritmo que cuente todos los caminos únicos desde s hasta t en la mejor complejidad temporal.
(Un camino único desde s hasta t se define como un camino desde s hasta t que no contiene ningún vértice en común con ningún otro camino desde s hasta t, excepto s y t).
He intentado mejorar el algoritmo utilizando el algoritmo descrito en este enlace (Imprimir todos los caminos desde un origen dado hasta un destino – https://www.geeksforgeeks.org/find-paths-given-source-destination/) eliminando los vértices que el camino ha recorrido, pero aún no veo que este algoritmo funcione con buena complejidad temporal.
Ahora estoy intentando ver si puedo hacer esto utilizando DFS en menos de |V| o |E| veces, pero nada está funcionando conmigo.
¿Alguna idea?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Un posible algoritmo que puede contar todos los caminos únicos desde s hasta t en la mejor complejidad temporal se basa en la programación dinámica.

    1. Primero, necesitamos encontrar todos los caminos posibles desde s hasta t utilizando DFS (Búsqueda en profundidad).
    2. Luego, creamos un nuevo grafo dirigido acíclico G’=(V’, E’), donde V’ es el conjunto de vértices en el grafo original G y cada vértice en V’ representa un camino único desde s hasta t. Agregamos una arista desde el vértice u hasta el vértice v en G’ si el camino representado por u puede extenderse al camino representado por v al agregar una arista más en G.
    3. Finalmente, computamos el número de caminos desde s hasta t en G’ utilizando la programación dinámica. Sea c(u) el número de caminos desde s hasta t que son representados por el vértice u en G’. Podemos calcular c(u) para cada vértice u en orden topológico utilizando la siguiente recursión:

    c(s) = 1
    c(u) = suma(c(v) para v en las aristas entrantes de u) para u distinto de s

    El resultado final es c(t), que nos da el número total de caminos únicos desde s hasta t en G.

    La complejidad temporal de este algoritmo depende del número de caminos posibles desde s hasta t, que puede ser exponencial en el peor caso. Sin embargo, si asumimos que el grafo G es disperso, es decir, |E| << |V|^2, entonces el número de caminos posibles también se espera que sea pequeño. En este caso, la complejidad temporal del algoritmo es O(|E| + |V|) para DFS y O(|E’| + |V’|) para la programación dinámica, lo cual es lineal en el tamaño de la entrada.

Comments are closed.