2.9学习总结

最短路径(dijkstra算法)

单源点最短路径
什么叫单源点最短路径?
单源点指的就是单一的起始点,那么单源点最短路径指的就是,从单一起始点到其余顶点的最短路径。
网图与非网图的单源点最短路径
对于非网图而言,最短路径表示的是由起始点到终点需要经过的最少路径条数
对于网图而言,最短路径表示的是由起始点到终点,所需花费的最少代价,也就是路径权值总和最小

模板代码

  1. 初始化:
    1.1 初始化dist[i]数组
    1.2 根据dist[i]数组来初始化path[i]数组
    1.3 初始化S集合,也就是初始化s[i]数组
  2. 查找后续顶点,不断地累加、更新、迭代,生成最短路径。
void ShortestPath_Dijkstra(MGraph *G,VertexType start)
{
	int i,j,num;
	int loc;
	int min;
	int dist[VertexMax];//最短路径长度数组 
	int path[VertexMax];//最短路径数组 
	int s[VertexMax];//代表集合S(1代表该顶点已处理,属于集合S;0代表该顶点未处理,不属于集合S,属于集合V-S) 
	
	//1.初始化dist和path数组 
	loc=LocateVex(G,start);//获取源点的下标位置 
	for(i=0;ivexnum;i++)
	{
		dist[i]=G->AdjMatrix[loc][i];//初始化dist数组
		
		if(dist[i]!=MaxInt)//初始化path数组
		{
			path[i]=loc;
		}
		else
		{
			path[i]=-1;
		}	  
	} 
    
    //2.初始化S数组(s数组:代表集合S,1代表该元素属于集合S(已处理的顶点),0该元素不属于集合S(未处理的顶点)) 
    for(i=0;ivexnum;i++)
	{
		s[i]=0;
	} 
	s[loc]=1;//代表起始点(源点)以处理完毕 
	num=1;
	
	//3.
	while(numvexnum)
	{
		min=FindMinDist(dist,s,G->vexnum);//在dist数组中查找其对应s[i]=0,即未处理的最小值元素 
		s[min]=1;//将找到的最短边所对应的的顶点加入集合S
		
		for(i=0;ivexnum;i++)//加入新的顶点后,更新dist和path数组 
		{
			if((s[i]==0)&&(dist[i]>dist[min]+G->AdjMatrix[min][i]))//路径累加
			{
				dist[i]=dist[min]+G->AdjMatrix[min][i];
				path[i]=min;
			}
		}
	    num++;	
	}    
} 

你可能感兴趣的:(学习)