【算法定义】
是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪克斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
【算法图示】
【程序设计】
/*********************************************************************************
*Function: Dijkstra
*Parameter1: 参数1:图的邻接矩阵型
*Parameter2: 参数2:源点编号
*Description: 狄克斯特拉算法,通过参数1传入的矩阵,参数2编号进行定位 ,通过最小生成
树来判断最小路径
*Output: 无
**********************************************************************************/
void Dijkstra(MGraph graph,uint8_t no)
{
int dist[MAXV],path[MAXV];
int arr[MAXV];
int mindis,i,j,u;
for (i=0;i<graph.n;i++)
{
dist[i]=graph.edges[no][i]; /* 距离初始化*/
arr[i]=0; /*arr[]置空*/
if (graph.edges[no][i]<INF) /* 路径初始化*/
{
path[i]=no;
}
else
{
path[i]=-1;
}
}
arr[no]=1;path[no]=0; /* 源点编号no放入arr中*/
for (i=0;i<graph.n;i++) /* 循环直到所有顶点的最短路径都求出*/
{
mindis=INF; /* mindis置最小长度初值*/
for (j=0;j<graph.n;j++) /* 选取不在s中且具有最小距离的顶点u*/
if (arr[j]==0 && dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
arr[u]=1; /* 顶点u加入s中*/
for (j=0;j<graph.n;j++) /* 修改不在s中的顶点的距离*/
if (arr[j]==0)
if (graph.edges[u][j]<INF && dist[u]+graph.edges[u][j]<dist[j])
{
dist[j]=dist[u]+graph.edges[u][j];
path[j]=u;
}
}
DisMinTree(path,arr,graph.n,no); /* 输出最小生成树*/
}