Dijkstra算法,有权单源最短路径

与无权单源最短路径相似,与层次遍历相似;以递增的顺序依次收录遇到的最短距离的顶点

int findmin(Graph G,int dist[],int collected[]) // 找到一个未被收录的最小值
{
	int Min = MAXNUM; // 保存最小值,初值为无穷大;
	int Mv;	// 保存最小值的位置
	for(int v = 0; v = G->Nv ; v++) // 遍历dist,找到未被收录的最小值
	{
		if(collected[v] ==false && dist[v] < Min) 判断是否为未被收录的最小值
		{
			Min = dist[v];
			Mv = v;
		}
	}
	if(Min < MAXNUM)
	{
		return Mv; // 返回最小值的顶点
	}
	else
	{
		return -1;  // 返回错误值
	}
}
bool Dijkstra(Graph G,int S) // S点作为原点,找到其它点距离S点的最短路径
{
		int dist[Maxnum]; // 数组初始化为无穷大值,用于存储距离
		int path[Maxnum];//初始化为-1,用于存储路径
		bool collected[Maxnum]; // 数组初始化为false;记录点是否被收录
		Adj W; int V;
		for(W = G->G[S].FirstEdge ; W ; W = W->next)
		// 初始化与S 点直接连通的点,把距离更新; (直接连通的点,最短路径为边的权值)
		{
			dist[W->Adjv] = W->weight; // 更新距离
			path[W->Adjv] = S;  // 更新路径;
		} 	
		dist[S] = 0; // 到自己的距离为0;
		collected[S] = true; // 收录该点;
		while(1)
		{
			V = findmin(G,dist,collected); // 找到一个最小值 ;
			if(V == -1) // 如果是错误的值
			{
				break;
			}
			collected[V] = true;  // 收录节点
			for(W = G->[V].FirstEdge ;W ; W=W->next) // 访问与该点相连通的点
			{
				if(collected[W->AdjV] == false) // 未被访问,
				{
					if(W->weight < 0) // 存在负值
					{
						return false; // Dijkstra算法不能解决负值问题
					}
					if(dist[W->AdjV] > dist[V] + W->weight) // 如果当前路径距离比原来距离小,更新距离
					{
						dist[W->AdjV] = dist[V] + W->weight;  // 更新距离
						path[W->AdjV] = V; // 更新路径
					}
				}
			}
		}
		return true;
}

猜你喜欢

转载自blog.csdn.net/weixin_40540957/article/details/84290973