必要なのは「推移閉包アルゴリズム」です
Floyd-Warshallアルゴリズムは、これらの1つの良い例ですが、 Johnsonのアルゴリズムのような他の多くの(多くの)アルゴリズムがあります。Google Scholarですばやく検索すると、他のいくつかの情報源とより技術的な説明が表示されます。
元の形式のFloyd-Warshallアルゴリズムのコード(接続されているすべてのポイント間の最短経路を見つける)は次のとおりです。
int dist[N][N]; // For some N
int i, j, k;
// Input data into dist, where dist[i][j] is the distance from i to j.
// If the nodes are unconnected, dist[i][j] should be infinity
for ( k = 0; k < N; k++ )
for ( i = 0; i < N; i++ )
for ( j = 0; j < N; j++ )
dist[i][j] = min( dist[i][j], dist[i][k] + dist[k][j] );
使用シナリオに合わせてこのコードを変更すると、次のようになります。
int dist[N][N]; // For some N
int i, j, k;
// Input data into dist, where dist[i][j] is the distance from i to j.
// If the nodes are unconnected, dist[i][j] should be infinity
for ( k = 0; k < N; k++ )
for ( i = 0; i < N; i++ )
for ( j = 0; j < N; j++ )
if(dist[i][k] && dist[k][j])
dist[i][j] = 1;
ここで下付き文字の順序に注意してください。この順序で添え字を付けると、動的計画法の基準が満たされ、パスが段階的に改善され、常に最適になります。
時間計算量はO(N ^ 3)です。