Número de caminos de longitud fija / Caminos más cortos de longitud fija
El siguiente artículo describe soluciones a estos dos problemas construidas sobre la misma idea: reducir el problema a la construcción de una matriz y calcular la solución con la multiplicación de matrices usual o con una multiplicación modificada.
Número de caminos de una longitud fija
Nos dan un grafo dirigido, no ponderado con vértices y nos dan un entero . La tarea es la siguiente: para cada par de vértices hay que encontrar el número de caminos de longitud entre estos vértices. Los caminos no tienen que ser simples, es decir, los vértices y las aristas se pueden visitar cualquier número de veces en un solo camino.
Asumimos que el grafo se especifica con una matriz de adyacencia, es decir, la matriz de tamaño , donde cada elemento es igual a si el vértice está conectado con por una arista, y si no están conectados por una arista. El siguiente algoritmo también funciona en el caso de aristas múltiples: si algún par de vértices está conectado con aristas, entonces podemos registrar esto en la matriz de adyacencia poniendo . También el algoritmo funciona si el grafo contiene bucles (un bucle es una arista que conecta un vértice consigo mismo).
Es obvio que la matriz de adyacencia construida es la respuesta al problema para el caso . Contiene el número de caminos de longitud entre cada par de vértices.
Construiremos la solución de forma iterativa: Supongamos que conocemos la respuesta para algún . Aquí describimos un método para construir la respuesta para . Denotemos por la matriz para el caso , y por la matriz que queremos construir. Con la siguiente fórmula podemos calcular cada entrada de :
Es fácil ver que la fórmula no calcula otra cosa que el producto de las matrices y :
Así, la solución del problema se puede representar de la siguiente forma:
Resta notar que los productos de matrices se pueden elevar a una potencia alta de forma eficiente usando exponenciación binaria. Esto da una solución con complejidad .
Caminos más cortos de una longitud fija
Nos dan un grafo dirigido ponderado con vértices y un entero . Para cada par de vértices hay que encontrar la longitud del camino más corto entre y que consiste de exactamente aristas.
Asumimos que el grafo se especifica por una matriz de adyacencia, es decir, vía la matriz de tamaño donde cada elemento contiene la longitud de las aristas del vértice al vértice . Si no hay arista entre dos vértices, entonces el elemento correspondiente de la matriz se asignará a infinito .
Es obvio que en esta forma la matriz de adyacencia es la respuesta al problema para . Contiene las longitudes de los caminos más cortos entre cada par de vértices, o si no existe un camino que consista de una arista.
Otra vez podemos construir la solución al problema de forma iterativa: Supongamos que conocemos la respuesta para algún . Mostramos cómo podemos calcular la respuesta para . Denotemos la matriz para y la matriz que queremos construir. Entonces la siguiente fórmula calcula cada entrada de :
Al mirar más de cerca esta fórmula, podemos trazar una analogía con la multiplicación de matrices: de hecho la matriz se multiplica por la matriz , la única diferencia es que en lugar de la operación de multiplicación tomamos el mínimo en lugar de la suma, y la suma en lugar de la multiplicación como operación interna.
donde la operación se define de la siguiente forma:
Así, la solución de la tarea se puede representar usando la multiplicación modificada:
Resta notar que también podemos calcular esta exponenciación de forma eficiente con exponenciación binaria, porque la multiplicación modificada es obviamente asociativa. Así que también esta solución tiene complejidad .
Generalización de los problemas para caminos con longitud hasta {data-toc-label=“Generalización de los problemas para caminos con longitud hasta k”}
Las soluciones de arriba resuelven los problemas para un fijo. Sin embargo las soluciones se pueden adaptar para resolver problemas en los que se permite que los caminos contengan no más de aristas.
Esto se puede hacer modificando ligeramente el grafo de entrada.
Duplicamos cada vértice: para cada vértice creamos un vértice más y agregamos la arista y el bucle . El número de caminos entre y con a lo sumo aristas es el mismo número que el número de caminos entre y con exactamente aristas, ya que hay una biyección que mapea cada camino de longitud al camino de longitud .
El mismo truco se puede aplicar para calcular los caminos más cortos con a lo sumo aristas. Otra vez duplicamos cada vértice y agregamos las dos aristas mencionadas con peso .