1.問題
負G、頂点集合Vは、m個の頂点にダイクストラ最短パスアルゴリズムG n個の頂点を用いて決定していない、図の特定の円与えられ、最短経路は、特に図は、以下のフロイドのアルゴリズム複数のソースを使用して決定されます
2.解析
ダイクストラ法は、単一始点最短経路アルゴリズム、すなわちaは、mが他のすべての頂点への最短経路を決定される点m開始与えられます。DIST | | == | V |主な考え方は、配列DISTとSを維持することで、Sはすべての最短パスが点がDISTのためのものであることが決定されている含まれ、任意DISTため[N-]、mは、出発点を表します決定された最短経路の頂点Sを通ります。アルゴリズムの主な流れは以下のとおりです。
1.選択さDISTは、頂点Iの頂点の最小値で決定されていない、iがSに追加されます
頂点iはdistの値を更新、追加しました
12時まで3.を繰り返して、資格のある頂点を見つけることができません
フロイドのアルゴリズムは、V mに属する任意の時点で得られるマルチソース最短パスアルゴリズムであり、他のすべての頂点への最短経路をmです。主なアイデアは、mは点までの最短距離まで通っ点からN点を表し、Dは、オプションD [M] [N]に、二次元アレイPとDを維持することです。Pは任意P [M] [N]であるため、点Nの経過にポイントmからの最短距離を表しています。任意の2点のためにM、N、それはそのようなD [M] [K] + D [k]を[N] <D [M] [n]は、上記の条件が満たされた場合、次にDことは、点kが存在してもよいですポイントのカレンダーの存在によって、何度も何度も更新され、あなたは、任意の2点間の最短経路の距離を取得することができます。それは、この経路P、特定のルートに格納されています。一例として、上記の図は、図の隣接行列から開始示し、Dは、(任意の点なし)mに対するnからの距離を表し、Pは点そこを通して最短距離を表します。
最初のパスの後、最初のチェックポイントのために、Mがあるか否かを判定し、N、D [m]は、[1] + D [1]〜[N] <D [M] [n]は、最初にそのような次のように図の更新します:
第2の更新後の第二の点を追加しました。
更新後の第3:
第四の更新後、すべての点間の最短経路です。
あなたがパスを検索したい場合は、この行列に応じて再帰Pのために見に行くことができます。
3.デザイン
[コア擬似]
ダイクストラ:
一方、(1){
V =最小点の点DISTを見つけるために決定されていません
If(找不到V)
Break
确定V
For(V的所有邻接点V1)
{
If(V1未确定)
Dist[V1] = min(dist[V]+<V,V1> , dist[V1])
}
}
Floyd:
D = G的邻接矩阵
For(k = 1;k <= G.vertex ;k++)
For(i = 1;I <= G.vertex;i++)
For(j = 1;j <= G.vertex;j++)
If(D[i][k]+D[k][j]<D[i][j])
{
D[i][j] = D[i][k]+D[k][j];
P[i][j] = k;
}
4. 分析
Dijkstra算法的时间复杂度,首先对于最外面的while循环,这个循环会执行|V|次,对于循环内部去遍历邻接点的操作,最多会执行|V|次,因此整个算法的时间复杂度是O(|V|2)
Floyd算法的时间复杂度是O(|V|3),因为主要内容就是三个循环,每个循环都进行了|V|次
针对于Dijkstra算法还是比较好理解的,因为只是单源最短路径,只要维护一个数组就可以了,对于其中的贪心算法的思想也可以理解。但是对于Floyd算法其中的动态规划的思想还是没有理解的很透彻。