我想知道如何修改此函数以保存节点的最终最短路径。这是我的教科书中的一些修改。
template <class vType, int size>
void weightedGraphType<vType, size>::shortestPath(vType vertex) {
int i, j;
double minWeight;
for (j = 0; j < gSize; j++) {
smallestWeight[j] = weights[vertex][j];
}
bool weightFound[size];
for (j = 0; j < gSize; j++) {
weightFound[j] = false;
}
for (i = 0; i < gSize; i++) {
int v;
cout << vertex << " to " << i << endl;
minWeight = INFINITY;
for (j = 0; j < gSize; j++) {
if (!weightFound[j]) {
if (smallestWeight[j] < minWeight) {
v = j;
minWeight = smallestWeight[v];
}
}
}
weightFound[v] = true;
for (j = 0; j < gSize; j++) {
if (!weightFound[j]) {
if (minWeight + weights[v][j] < smallestWeight[j]) {
smallestWeight[j] = minWeight + weights[v][j];
}
}
}
} //end for
} //end shortestPath
答案 0 :(得分:4)
这是一个提示:对于每个节点,您知道找到的最小重量。您也可以知道在到达此节点之前“到达此节点的最短路径”的位置。
答案 1 :(得分:0)
创建数组以记住目标节点的前任,然后追溯。
以下是修改后的dijkstra
的完整实现#include<stdlib.h>
#include<set>
#include<iostream>
#include<vector>
#include<list>
#include<limits.h>
using namespace std;
struct myHeapcmp{
bool operator()(const pair<int,int> &a,const pair<int,int>&b){
return a.second<b.second;
}
};
typedef list<pair<int,int> > AdjList;
typedef vector<AdjList> Graph;
typedef multiset<pair<int,int>,myHeapcmp>MinHeap;
vector<int> dijkstra(Graph g,int N,int s){
vector<int>d(N,100);
vector<int> predecessor(N);
d[s] =0;
vector<int>p(N,-1);
vector<MinHeap::iterator>HeapPos(N);
MinHeap h;
for(int i=0;i<N;i++)
HeapPos[i] = h.insert(make_pair(i,d[i]));
MinHeap::iterator it;
while(h.size()>0){
it = h.begin();
int v = it->first;
h.erase(it);
AdjList::iterator it2;
for(it2=g[v].begin();it2!=g[v].end();it2++){
int u = it2->first;
int w_uv= it2->second;
if(d[u]>w_uv+d[v]){
d[u]= w_uv+d[v];
predecessor[u] = v;
p[u]=v; h.erase(HeapPos[u]);
HeapPos[u]= h.insert(make_pair(u,d[u]));
}
}
}
for(int i = 0;i<N;i++){
int node = i;
int pre = predecessor[i];
cout<<i<<" :";
while(pre!=s){
cout<<pre<<" ";
node = pre;
pre = predecessor[node];
}
cout<<s<<endl;
}
return d;
}
答案 2 :(得分:-2)
这样做的一种方法是引入一个额外的循环,在所有节点上迭代算法,并且通过距离数组,您可以存储“via node”元素。 一旦从每个节点到每个其他节点计算出最短路径,您所要做的就是遵循已存储的“via node”值。 顺便说一句,就效率而言,这个算法糟透了,它是O(n ^ 3)。