Dijkstra算法是求最短路径的一种很有代表性的算法。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。
算法的基本思路:
1. 初始时令 S={V0},T={其余顶点},T中顶点对应的距离值
若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值
若不存在<V0,Vi>,d(V0,Vi)为∞
2. 从T中选取一个其距离值为最小的顶点W且不在S中,加入S
3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值缩短,则修改此距离值
重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止
之前做了一道算法题用到过dijkstra算法,具体题意忘了,这里贴一下源代码作为dijkstra算法的示例代码:
#include<iostream> #include<cstring> using namespace std; const int MIN=1000000; int flag[5]; int a[5][5]; int dis[5]; int main() { memset(flag,0,sizeof(flag)); memset(a,MIN,sizeof(a)); //初始化矩阵 int dian,bian; int u,v1,w1; cin>>dian>>bian; //输入点和边的数量 for(int i=0;i<bian;i++) { cin>>u>>v1>>w1; a[u][v1]=w1; //填充邻接矩阵 } for(int i=0;i<dian;i++) { dis[i]=a[0][i]; //dis[i]表示从起点到顶点i的距离 } flag[0]=1; //标记顶点是否已加入集合 dis[0]=0; int v=0,w; for(int i=0;i<dian;i++) { int min=MIN; for(w=0;w<dian;w++) if(!flag[w]&&dis[w]<min) //找到不在集合中并且离起点距离最短的顶点 { v=w; //记录顶点 min=dis[w]; } flag[v]=1; for(w=0;w<dian;w++) //更新选中的顶点到未选中顶点集合中所有顶点的距离 if(!flag[w]) if(min+a[v][w]<dis[w]) //通过中间顶点来更新 dis[w]=min+a[v][w]; } for(int i=0;i<5;i++) cout<<dis[i]<<endl; return 0; }