Dijkstra算法的概要
摘自百度百科
迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止
注意:Dijkstar解决有向无负权图的单源最短路径问题(可以是有环图)
Dijkstra的实现思想
-
Dijkstra 算法从指定的节点(源节点)出发,寻找它与图中所有其它节点之间的最短路径。
-
Dijkstra 算法会记录当前已知的最短路径,并在寻找到更短的路径时更新。
-
一旦找到源节点与其他节点之间的最短路径,那个节点会被标记为“已访问”并添加到路径中。
-
重复寻找过程,直到图中所有节点都已经添加到路径中。这样,就可以得到从源节点出发访问所有其他节点的最短路径方案。
Dijkstra代码实现
对于给定的图:求D到其他点的最短路径
#include<iostream>
using namespace std;
const int INF=0x3f3f3f3f;
int matrix[7][7]=
{
//A B C D E F G
/*A*/{INF,12,INF,INF,INF,16,14},
/*B*/{12,INF,10,INF,INF,7,INF},
/*C*/{INF,10,INF,3,5,6,INF},
/*D*/{INF,INF,3,INF,4,INF,INF},
/*E*/{INF,INF,5,4,INF,2,8},
/*F*/{16,7,6,INF,2,INF,9},
/*G*/{14,INF,INF,INF,8,9,INF}
};
int vis[7],s[7],u[7],nextnode[7];
void dijkstra(int index)
{
vis[index]=1;
for(int i=0;i<7;i++)
{
u[i]=matrix[index][i];
}
int min_cur=index;
int count=6;
while(count--)
{
int minx=INF;
for(int i=0;i<7;i++)
{
if(u[i]<minx&&!vis[i])
{
minx=u[i];
min_cur=i;
}
}
vis[min_cur]=1;
s[min_cur]=minx;
for(int i=0;i<7;i++)
{
int tmp=matrix[min_cur][i]==INF?INF:minx+matrix[min_cur][i];
if(!vis[i]&&tmp<u[i])
{
u[i]=tmp;
nextnode[i]=min_cur;
}
}
}
}
int main()
{
for(int i=0;i<7;i++)
{
nextnode[i]=-1;
}
dijkstra(3);
for(int i=0;i<7;i++)
{
cout<<"D到"<<char(i+'A')<<"的最短路径:"<<s[i]<<endl;
}
int index=0;
for(int i=0;i<7;i++)
{
int index=i;
while(index!=-1)
{
cout<<char(index+'A');
index=nextnode[index];
}
cout<<"D"<<endl;
}
return 0;
}