【ACM程序设计】求最短路 Dijkstra算法

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;
			}
		}
	}
}
posted @ 2022-05-07 22:08  tavee  阅读(72)  评论(0)    收藏  举报
****************************************** 页脚Html代码 ******************************************