数据结构最短路径算法(c++)

首先是单源最短路问题,肯定是Dijkstra算法:

实现原理:

每次收入一个已求得最短路的点的时候,修正其邻接点到源头的最短路径,逐一修正,最后得到所有的最短路。

实现代码:

#define MAXVEX 9
#define INFINITY 65535
typedef int Patharc[MAXVEX]	/*用来存储最短路径下标的数组*/
typedef int ShortPathTable[MAXVEX]	/*用来存储到各点最短路径的权值和*/
void ShortestPath_Dijkstra(MGraphy G,int v0,Patharc *P,ShortPathTable *D)
{
	int v,w,k,min;
	int final[MAXVEX];
	for(v=0;v<G.numVertexes;v++){
		final[v]=0;
		(*D)[v]=G.arc[v0][v];
		(*P)[v]=0;
	}
	(*D)[v0]=0;
	final[v0]=1;
	/*开始主循环,每次循环求得v0到某个点v得最短路径*/
	for(v=1;v<G.numVertexes;v++){
		min=INFINITY;
		for(w=0;w<G.numVertexes;w++){
			if(!final[w]&&(*D)[w]<min){
				k=w;
				min=(*D)[w];
			}
		}
		final[k]=1;
		for(w=0;w<G.numVertexes;w++){
			if(!final[w]&&min+G.arc[k][w]<(*D)[w]){
				(*D)[w]=min+G.arc[k][w];
				(*P)[w]=k;
			}
		}
	}
}

接下来是多源最短路的问题,即Floyd算法:

实现思路:

其实就是一个相当暴力的算法,三重循环,进行遍历。

实现代码:

typedef int Pathmatirx[MAXVEX][MAXVEX]	/*用来存储最短路径下标的数组*/
typedef int ShortPathTable[MAXVEX][MAXVEX]	/*用来存储到各点最短路径的权值和*/
void ShortestPath_Floyd(MGraphy G,Pathmatirx *P,ShortPathTable *D)
{
	int v,w,k;
	for(v=0;v<G.numVertexes;++v){
		for(w=0;w<G.numVertexes;++w){
			(*D)[v][w]=G.matirx[v][w];
			(*P)[v][w]=w;
		}
	}
	for(k=0;k<G.numVertexes;++k){
		for(v=0;v<G.numVertexes;++v){
			for(w=0;w<G.numVertexes;++w){
				if((*D)[v][w]>(*D)[v][k]+(*D)[k][w]){
					(*D)[v][w]=(*D)[v][k]+(*D)[k][w];
					(*P)[v][w]=(*P)[v][k];
				}
			}
		}
	}
}

而最短路径的显示代码可以这么写:

for(v=0;v<G.numVertexes;v++){
	for(w=v+1;w<G.numVertexes;w++){
		printf("v%d-v%d weight: %d",v,w,D[v][w]);
		k=P[v][w];
		printf(" path: %d",v);
		while(k!=w){
			printf(" -> %d",k);
			k=P[k][w];
		}
		printf(" -> %d\n",w)
	}
	printf("\n");
}

这里稍微注意一点,Floyd算法里的P[v][w]代表从v到w这条路径上从v开始走的第一步。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值