Dijkstra算法
dijstra算法也是基于贪心的思想,用于求一个点到所有其他点的最短距离的算法。
流程:
- (1)建立两个集合分别表示已经找到最小值的点(已经到达)和没有找到最小值的点(没有到达)。(初始时所有点都没有找到)。再建立一个表示该点到起点的距离的数组。(初始时所有点都没有到起点的路径,表示为-1)
- (2)将起点置入已经找到最小值的点,将距离标记为零,然后将与该点有直接路径的点的距离更新。
- (3)找到未到达的点中距离最小的点,将其置入已到达的点,重复步骤(2),直到更新完所有的点。
若dist[v]比dist[vpre]+MGraph[vpre][v]大则:更新dist[v]为dist[vpre]+MGraph[vpre][v],更新path[v]为Vpre。
void Dijkstra(int n, float MGraph[][n], int v0, int dist[], int path[])
{
int set[maxSize];
int min, v;
//初始化dist path set数组
for (int i = 0; i < n; i++)
{
dist[i] = MGraph[v0][i];
set[i] = 0;
if (MGraph[v0][i] < INF)
path[i] = v0;
else
path[i] = -1;
}
set[v0] = 1; path[v0] = -1;
//对剩余的每个顶点做处理 只需要处理n-1次
for (int i = 0; i < n - 1; i++)
{
//选一个离当前顶点最近的没有并入的点 把它作为当前顶点
min = INF;
for (j = 0; j < n; j++)
if (set[j] == 0 && dist[j] < min)
{
v = j;
min = dist[j];
}
set[v] = 1;
//关键步骤
for (int j = 0; j < n; j++)
{
if (set[j] == 0 && dist[v] + MGraph[v][j] < dist[j])
{
dist[j] = dist[v] + MGraph[v][j];
path[j] = v;
}
}
}
}