数据结构 Dijkstra算法 改良版 多条最短路径问题通用解决方案——C语言实现

Dijkstra算法是图论中的一个重要的基础算法,是解决有权图单源最短路径问题的核心算法,大家需要牢固掌握;

我们先来回顾下Dijkstra算法:WeightType dist[] 是记录最短路径值的数组,Vertex path[] 是记录最短路径下每个顶点的前驱顶点 的数组

结构体设计说明

typedef int Vertex;     //顶点
typedef int WeightType; //边权
typedef int DataType;   //顶点数据(点权)

//边
typedef struct _Edge{
	Vertex V1,V2;
	WeightType Weight;
}Edge;

//邻接矩阵存储的图
typedef struct _MGraph{
	int Nv;               //顶点数
	int Ne;               //边数
	WeightType G[MaxVertexNum][MaxVertexNum]; // 邻接矩阵
	DataType Data[MaxVertexNum]; //存顶点的数据 很多情况下,顶点无数据,此时不用出现
}MGraph;

Dijkstra

/* 邻接矩阵存储 —— 有权图的单源最短路算法 */

bool Dijkstra( MGraph* Graph,int dist[],int path[],Vertex S )
{
	int collected[MaxVertexNum];
	Vertex V,W;
	
	/* 初始化:此处默认邻接矩阵中不存在的边用INFINITY表示 */
	for(V=0;V<Graph->Nv;V++){
		
		dist[V] = Graph->G[S][V];
		if(dist[V]<INFINITY){
			path[V] = S;
		}else{
			path[V] = -1;
		}
		
		collected[V] = false;
	}
	/* 先将起点S收入集合 */
	dist[S] = 0;
	collected[S] = true;
	
	while(1){
		/* V=未被收录顶点中dist最小者 */
		V = FindMinDist( Graph,dist,collected );
		
		if(V==ERROR) break;//若这样的V不存在,即所有的顶点都收录完成
		
		collected[V] = true; // 收录V
		for(W=0;W<Graph->Nv;W++){ //对图中的每个顶点W
			
			/* 若W是V的邻接点并且未被收录 */
			if(collected[W])==false &&Graph->G[V][W]<INFINITY){
				
				if(Graph->G[V][W] < 0){ //若有负边
					return false;       //Disjkstra算法无法解决,返回错误标记
				}
				/* 若收录V使得dist[W]变小 */
				if(dist[V]+Graph->G[V][W] < dist[W]){
					
					dist[W] = dist[V] + Graph->G[V][W]; //修正dist[W]
					path[W] = V;                        //修正S到W的路径
				}
			}
		}
	} /* while结束 */
	
	return true; /* 算法执行完毕,返回正确标记 */
}

Vertex FindMinDi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值