您的位置:首页 > 其它

单源最短路径——Dijkstra算法

2017-10-31 18:06 344 查看

算法描述

1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

接下来以例子说明:



C++代码实现

#include<bits/stdc++.h>
//#include<algorithm>
using namespace std;

const int maxn=50;
const int INF=1000;
int G[maxn][maxn];
int vsit[maxn];
int cost[maxn];
int path[maxn];
int sum;

void print_path(int v){
if(v==path[v])  {
cout<<1;
return;
}
sum+=G[v][path[v]];
print_path(path[v]);
cout<<"->"<<v;
}

void Dijkstra(int v,int n){
vsit[v]=1;
for(int i=1;i<n;i++){
path[i]=v;
cost[i]=G[v][i];
if(G[v][i]<0){
cost[i]=INF;
path[i]=0;
}
}
path[v]=v;
int k=v,q;
for(int j=1;j<n-1;j++){
int min=INF;
for(int i=1;i<n;i++){
if(!vsit[i]&&G[k][i]>0&&cost[i]<min){
min=cost[i];
q=i;
}
}
vsit[q]=1;
k=q;
for(int i=1;i<n;i++){
if(!vsit[i]&&G[k][i]>0&&G[k][i]+cost[k]<cost[i]){
cost[i]=G[k][i]+cost[k];
path[i]=k;
}
}
}
}
int main(){
memset(G,-1,sizeof(G));
int n=7;
G[1][6]=14;G[1][2]=7;G[1][3]=9;
G[2][3]=10;G[2][4]=15;G[2][1]=7;
G[3][1]=9;G[3][2]=10;G[3][6]=2;G[3][4]=11;
G[4][3]=11;G[4][2]=15;G[4][5]=6;
G[5][4]=6;G[5][6]=9;
G[6][5]=9;G[6][3]=2;G[6][1]=14;

memset(vsit,0,sizeof(vsit));
Dijkstra(1,n);
for(int i=1;i<n;i++){
sum =0;
print_path(i);
cout<<" sum="<<sum<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: