标签:大于 来源 mem 重复 步骤 迪杰斯特拉 text amp ring
迪杰斯特拉算法(dijkstra)-最短路径
简介:
迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
算法思想:
设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法结束),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点到S中各顶点的最短路径长度不大于从源点到U中任何顶点的最短路径长度。
算法步骤:
算法实例:
代码实例:
1 #include<iostream> 2 #include<cstring> 3 #define INF 1000000 4 using namespace std; 5 const int maxn=1000; 6 int dis[maxn],g[maxn][maxn],n;//存储最短距离,图矩阵,顶点数 7 bool v[maxn]; //判断顶点是否访问 8 9 void dijkstra() 10 { 11 for(int i=1;i<=n;++i) 12 dis[i]=INF;//初始化最短距离 13 dis[1]=0;//到自身的距离为0 14 memset(v,0,sizeof v); //初始化为未访问 15 for(int i=1;i<=n;++i) 16 { 17 int mark=-1,mindis=INF; 18 for(int j=1;j<=n;++j) 19 if(!v[j]&&dis[j]<mindis)//在未确定的点中取当前以得最短路径 20 { 21 mindis=dis[j]; 22 mark=j; 23 } 24 v[mark]=1; 25 for(int j=1;j<=n;++j)//更新最短路径 26 if(!v[j]) 27 dis[j]=min(dis[j],dis[mark]+g[mark][j]); 28 } 29 } 30 int main() 31 { 32 int m,a,b,c;//边数,顶点a,b,权重 33 memset(g,10000,sizeof g);// 初始化图矩阵 34 memset(dis,10000,sizeof dis);// 初始化 dis矩阵 35 cin>>n>>m; 36 for(int i=0;i<m;i++) 37 { 38 cin>>a>>b>>c; 39 g[a][b]=c; 40 g[b][a]=c; 41 } 42 dijkstra(); 43 for(int i=1;i<=n;i++) 44 { 45 cout<<dis[i]<<endl; 46 } 47 return 0; 48 }
ps:无负边
ps:部分资料来源网上
标签:大于 来源 mem 重复 步骤 迪杰斯特拉 text amp ring
原文地址:http://www.cnblogs.com/qiujun/p/6178621.html