单源最短路径——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; }
相关文章推荐
- [数据结构]Dijkstra算法求单源最短路径
- 算法导论-单源最短路径-Dijkstra算法的实现
- Dijkstra算法(单源最短路径)
- Dijkstra算法求带权图的单源最短路径
- 图的单源最短路径:Dijkstra算法实现
- 图算法 单源最短路径 Dijkstra算法(邻接表/邻接矩阵+优先队列STL)
- 单源最短路径算法--Dijkstra算法和Bellman-Ford算法
- 图论——单源最短路径算法之Dijkstra算法
- 图——单源最短路径问题-dijkstra算法
- Dijkstra算法---单源最短路径
- <C/C++图>单源最短路径:Dijkstra算法
- Pku acm 2253 Frogger数据结构题目解题报告(六)—单源最短路径:Dijkstra算法
- 求图的邻接表表示法的单源最短路径 Dijkstra算法
- 贪心算法--Dijkstra算法(单源最短路径算法)
- C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)
- 单源最短路径—Dijkstra算法(C++)
- 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
- 每日一题 No.48 单源最短路径问题2(Dijkstra算法)
- 单源最短路径算法 - Dijkstra算法
- Dijkstra算法(单源最短路径)