迪杰斯特拉(Dijkstra)算法
迪杰斯特拉算法是求图中某一顶点到其余各顶点的最短路径。
已并入的顶点 | 剩余顶点 | dist[ ] | path[ ] |
0 | 1,2,3,4,5,6 | 0,4,6,6,x,x,x | -1,0,0,0,-1,-1,-1 |
0,1 | 2,3,4,5,6 | 0,4,5,6,11,x,x | -1,0,1,0,1,-1,-1 |
0,1,2 | 3,4,5,6 | 0,4,5,6,11,9,x | -1,0,1,0,1,2,-1 |
0,1,2,3 | 4,5,6 | 0,4,5,6,11,9,x | -1,0,1,0,1,2,-1 |
0,1,2,3,5 | 4,6 | 0,4,5,6,10,9,17 | -1,0,1,0,5,2,5 |
0,1,2,3,5,4 | 6 | 0,4,5,6,10,9,16 | -1,0,1,0,5,2,4 |
0,1,2,3,5,4,6 | 无 | 0,4,5,6,10,9,16 | -1,0,1,0,5,2,4 |
详细代码:
#include <iostream>
#include <stack>
using namespace std;
const int maxsizes = 500;
const int INF = 0x0000ffff;
int n,e;
int edge[maxsizes][maxsizes];
int dist[maxsizes],path[maxsizes];
bool visit[maxsizes];
void Dijkstra(int v){
fill(dist,dist+maxsizes,INF);
fill(path,path+maxsizes,-1);
fill(visit,visit+maxsizes,false);
dist[v] = 0;
for(int i=0;i<n;++i){
int min=INF,k=0;
for(int j=0;j<n;++j){
if(visit[j]==false && dist[j]<min){
k = j;
min = dist[j];
}
} // 最小值
visit[k] = true;
for(int j=0;j<n;++j){
if(visit[j]==false && edge[k][j]+dist[k]<dist[j]){
dist[j] = dist[k]+edge[k][j];
path[j] = k;
}
}
}
}
// 打印路径函数
void printpath(int v){
stack<int> st;
while(path[v]!=-1){
st.push(v);
v = path[v];
}
st.push(v);
while(st.empty()==false){
cout<<st.top()<<" ";
st.pop();
}
}
/*
7 12
0 1 4
0 2 6
0 3 6
1 2 1
1 4 7
2 4 6
2 5 4
3 2 2
3 5 5
4 6 6
5 4 1
5 6 8
*/
// 迪杰斯特拉算法 Dijkstra算法 最短路径
int main(void){
cin>>n>>e;
fill(edge[0],edge[0]+maxsizes*maxsizes,INF);
for(int i=0;i<e;++i){
int x,x1,x2;
cin>>x1>>x2>>x;
edge[x1][x2] = x;
}
Dijkstra(0);
printpath(6);
return 0;
} // jinzheng 2018.11.4 14:35