该算法要求图中不存在负权边,适合稠密图和顶点关系密切;
求单源点最短路径:定义一个dis数组来保存源点到其他点的最短距离,并通过松弛操作不断更新dis数组
HDOJ2544 最短路
1.初始保存点的图
void chushi()
{
int i, j;
for (i = 1; i <= n;i++)
for (j = 1; j <= n; j++)
{
if (i == j)
map[i][j] = 0;
else
map[i][j] = INF;
}
}
2.将其他点到单源点的初始值赋值到dis数组;
for (i = 1; i <= n; i++)
dis[i] = map[1][i];
3.将dis[1]标记,通过遍历所有点找到当前离源点最短距离的点,并将此点标记,然后通过此点进行松弛操作来更新dis数组的值,将此操作循环n-1次后dis数组的值就是源点到其他点的最短距离;
mark[1] = 1;
for (k = 1; k <= n-1; k++)
{
temp = INF;
for (i = 1; i <= n;i++)
if (!mark[i] && dis[i] < temp)
{
j = i;
temp = dis[i];
}
if (temp == INF)
return;
mark[j] = 1;
for (i = 1; i <= n; i++)
{
if (map[j][i]<INF)
if (dis[i] > dis[j] + map[j][i])
dis[i] =dis[j]+ map[j][i];
}
}
}