最短路径算法Dijkstra算法(迪杰斯特拉算法)
算法过程
来源网络
算法思想
个人理解
其实就是借住已知的最短路径求下一条最短路径 (最短路径上任意段均为最短路径)
如果当前找到的比上一次短则跟新距离
代码
#include<iostream>
#include<stack>
using namespace std;
#define M 100
#define N 100
typedef struct MGraph
{
int matrix[N][M];
int n; //定点个数
int e; //边的个数
}MGraph;
//dist[i] 表示当前找到的v0到i的最短距离
//path[i] 表示v0到i i的前一节点
void Dij(MGraph g,int *dist,int *path, int v0)
{
bool* visted=new bool[g.n];
//初始化找到的最短距离
int i;
for( i=0;i<g.n;i++)
{
visted[i]=false;
if(g.matrix[v0][i]>0&&i!=v0)
{
dist[i]=g.matrix[v0][i];//当前所找到的v0到i的最短距离
path[i]=v0;
}
else{
dist[i]=INT_MAX;
path[i]=-1; //到该点没有路径
}
}
visted[v0]=true;
dist[v0]=0;
path[v0]=v0;
for( i=1;i<g.n;i++)
{
//在当前距离记录中找到最短的距离
int mindist=INT_MAX;
int u; //记录最短距离所对应的节点
for(int j=0;j<g.n;j++)
{
if(dist[j]<mindist&&visted[j]==false)
{
mindist=dist[j];
u=j;
}
}
visted[u]=true;//找到了以u为终点的最短距离
//借住该点计算改点到其他未访问点的距离
for(int k=0;k<g.n;k++)
{
if(visted[k]==false&&g.matrix[u][k]>0&&g.matrix[u][k]+dist[u]<dist[k])
{
dist[k]=g.matrix[u][k]+dist[u];
path[k]=u;
}
}
}
}
//显示v0 ->v最短路径
void showpath(int* path,int v0,int v)
{
stack<int> s;
while(v!=v0){
s.push(v);
v=path[v];
}
s.push(v);
while(!s.empty()){
cout<<s.top()<<" ";
s.pop();
}
}
int main()
{
int n,e;
while(cin>>n>>e)
{
int* dist=new int[n];
int* path=new int[n];
int i,j,s,t,w,v0;
MGraph g;
g.n=n;
g.e=e;
for( i=0;i<M;i++)
{
for( j=0;j<N;j++){
g.matrix[i][j]=0;
}
}
for( i=0;i<e;i++)
{
cin>>s>>t>>w;
g.matrix[s][t]=w;
}
cin>>v0;
Dij( g,dist,path, v0);
for( i=0;i<n;i++){
if(i!=v0){
showpath( path, v0, i);
cout<<dist[i]<<endl;
}
}
return 0;
}
}