Você pode tentar criar uma versão do Floyd-Warshall mais rápida em matrizes esparsas.
Primeiro, vamos relembrar o que esse algoritmo faz:
Seja uma matriz de distâncias. No início do algoritmo M i , j é o peso da aresta i → j . Se essa aresta não existir, então M i , j = ∞MMi , ji → jMi , j= ∞ .
O algoritmo possui etapas. Na etapa k do algoritmo, para cada par de nós i , j , definimosVki , j
Mi , j← min { Mi , j, Mi , k+ Mk , j} .
Claramente, se ou M k , j = ∞ , nenhuma atualização precisa ser executada. Assim, nos primeiros passos do algoritmo, precisamos apenas de executar cerca de d e g i n ( k ) ⋅ d e g o u t ( k ) comparações onde d e g i n ( k ) e d e g o u t (Mi , k= ∞Mk , j= ∞de geu n( k ) ⋅ de go u t( K )de geu n( K )são preenchidas. Portanto, os últimos passos podem levar muito mais tempo. denotam o número de arestas de entrada e saída do k- ésimo nó, respectivamente. À medida que o algoritmo progride, mais e mais entradas da matriz Mde go u t( K )kM
Observe que precisamos de uma maneira eficiente de iterar apenas células não-infinitas no k ésima linha e coluna da matriz. Isso pode ser feito mantendo um conjunto de arestas de entrada e saída para cada nó.
E= O ( V)k = 0O ( 1 )MO ( V)k = | V|O ( V2) O ( V3)