Dijkstra最短路径算法

时间:2023-03-08 19:36:48
#include <iostream>
#include <vector>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath> using namespace std; const int MAXINT = ;
const int MAXNUM = ;
int dist[MAXNUM];
int prev[MAXNUM];
int len;
int v00 = ;
int A[MAXNUM][MAXNUM]; void input(){
cin >> len;
for (int i = ; i < len ; i++){
for (int j = ; j < len ; j++){
int a;
cin >> a;
A[i][j] = a;
}
}
} void Dijkstra(int v0)
{
bool S[MAXNUM]; // 判断是否已存入该点到S集合中
int n=MAXNUM;
for(int i=; i<n; ++i) {
dist[i] = A[v0][i];
S[i] = false; // 初始都未用过该点
if(dist[i] == MAXINT)
prev[i] = -;
else
prev[i] = v0;
}
dist[v0] = ;
prev[v0] = -;
S[v0] = true;
for(int i=; i<len; i++){
int mindist = MAXINT;
int u = v0; // 找出当前未使用的点j的dist[j]最小值
for(int j=; j<len; ++j){
if((!S[j]) && dist[j]<mindist){
u = j; // u保存当前邻接点中距离最小的点的号码
mindist = dist[j];
}
}
S[u] = true;
for(int j=; j<len; j++){
if((!S[j]) && A[u][j]<MAXINT){
if(dist[u] + A[u][j] < dist[j]) //在通过新加入的u点路径找到离v0点更短的路径
{
dist[j] = dist[u] + A[u][j]; //更新dist
prev[j] = u; //记录前驱顶点
}
}
}
}
} void output(){
for(int i = ; i < len ; i++){
cout <<v00<< " to "<< i <<"'s minDis="<< dist[i] <<" path =( ";
std::vector<int> p;
int t = i;
while(t != -){
//cout << t<<" ";
p.push_back(t);
t = prev[t];
}
//cout << "p size="<<p.size()<<endl;
reverse(p.begin(), p.end());
for(int j = ; j < p.size() ; j++){
cout << p[j] << " ";
}
cout << ")"<<endl;
}
} int main(){
input();
Dijkstra(v00);
output();
return ;
}