[テンプレート]マルチソースの最短経路(フロイドアルゴリズム)

移動:自分のブログ

動的プログラミングのアイデア:d [i] [j] [k]を使用して、「1〜kの番号が付けられたノード(開始点と終了点を除く)のみを通過する場合、ノードiからノードjへの最短経路の長さ」を表します。d [i] [j] [k] = min {d [i] [j] [k-1]、d [i] [k] [k-1] + d [k] [j] [k-1 ]}、ナップザック問題のアイデアを借りて、d [i] [j] [k]はd [] [] [k-1]またはd [] [] [k-1]からの更新のみを継承するため、[k ]この次元。d [i] [j]は、i-> jのエッジの重みに初期化されます(エッジがない場合は無限、i = jの場合は0)。

メインコードセグメントは次のとおりです。

for(int k=1;k<=n;k++)
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			d[i][j]=min(d[i][j],d[i][k]+d[k][j]);

 注:「1〜kノードのみを通過するパス長」を更新する場合、使用されるデータは「1〜k-1ノードのみを通過する最短パス長」でなければならないため、k次元はループの最も外側に配置する必要があります。 "、したがって、k番目のラウンドが更新されるとき、k-1ラウンドは完全に更新されている必要があります。

おすすめ

転載: blog.csdn.net/zjgmartin/article/details/108415435
おすすめ