私たちは、ソースポイントから頂点の残りの部分に到達するための最短距離を解決するためのDijstraアルゴリズムを使用する前に1.、その後、どのようにそれを通して最短距離のVの頂点に到達するためにソースポイントを解決するには?
2.次のようにアルゴリズムの実行は次のとおりです。
我々は中間体を介して見つけた場合①は、実際に、我々は、非常に単純な記録前のノードから元の使用Dijstraアルゴリズム最短距離で頂点vソース点Sからの最短距離に基づいて予めアレイに追加する必要があり、そう頂点Uが頂点vにソースポイントからソース頂点vの距離から最短経路上の頂点に到達する前に、短い時間を記録することができるように
②Dijstraアルゴリズムが終了すると、我々が記録頂点で経験頂点からの最短距離の残りの部分へのソースSから、フロントが、我々だけ解決前駆最短経路上の各頂点、完全な解決方法トレイル?
pre[4] = 3;
pre[3] = 2;
pre[2] = 1;
pre[1] = 1;
我々は出発点V1がV4に到達する最短経路を知りたい場合、我々は、前で開始する必要がある[4]、A前駆ノードV3、V4、および[3]予備から前駆ノードV3 V2を得るために、その後、プレから[2]前駆V2を得ノードV1は、実際には、これは再帰的なプロセスであり、事前の前駆体を見つけるために、情報を継続して使用します
3.特定のコードは次のように
#include<cstdio>
#include<iostream>
using namespace std;
const int maxSize = 1000;
const int INF = 100000000;
int n, m, s, G[maxSize][maxSize];
int d[maxSize];
bool vis[maxSize] = {false};
//pre[v]数组表示从起点到顶点v的最短路径上v的前一个顶点
int pre[maxSize];
void Dijstra(int s){
fill(d, d + maxSize, INF);
d[s] = 0;
for(int i = 0; i < n; i++){
int u = -1, min = INF;
for(int j = 0; j < n; j++){
if(vis[j] == false && d[j] < min){
u = j;
min = d[j];
}
}
if(u == -1) return;
vis[u] = true;
for(int v = 0; v < n; v++){
if(vis[v] == false && G[u][v] != INF && d[u] + G[u][v] < d[v]){
d[v] = d[u] + G[u][v];
pre[v] = u;
}
}
}
}
//输出源点到顶点v的最短路径
void shortPath(int s, int v){
if(s == v){
//相等的时候说明已经找到了第一个节点可以层层返回进行输出
cout << s << " ";
return;
}
shortPath(s, pre[v]);
cout << v << " ";
}
int main(void){
int u, v, w;
cin >> n >> m >> s;
//初始化的时候将每个顶点的前驱设置为自己
for(int i = 0; i < n; ++i) pre[i] = i;
fill(G[0], G[0] + maxSize * maxSize, INF);
for(int i = 0; i < m; i++){
cin >> u >> v >> w;
G[u][v] = w;
}
Dijstra(s);
for(int i = 0; i < n; i++){
cout << d[i] << " ";
}
// cout << endl;
//使用递归的方法来输出其中的最短路径
//输入v顶点
cin >> v;
// cout << s << " " << v << endl;
shortPath(s, v);
}