图-最短路径之弗洛伊德算法

多源点最短路径-弗洛伊德算法(Floyd)

求所有顶点到所有顶点的最短路径,而迪杰斯特拉是求单源点到所有顶点的最短路径。

几个用到的变量和数组的含义:

  • 变量k:中转顶点坐标
  • 数组P:存放顶点之间的中转结点的数组,比如:
P[1][4] = 2;//顶点1到顶点4途径顶点2
P[2][4] = 3;//顶点2到顶点4又途径顶点3
P[3][4] = 4;//顶点3到顶点4经过顶点4,即表明3->4之间无中转顶点了。
  • 从而得:
  当P[v][k] == k的时候,即走到了路径的最后。
  • 数组D:存放了顶点到顶点之间的最小路径和。

代码实现:

typedef int ShortPathTable[MAXVEX][MAXVEX]
typedef int PathMatrix[MAXVEX][MAXVEX]
void Floyd(MGraph G, PathMatrix *P, ShortPathTable *D)
{
	int v, w, k; /*k为中转顶点的下标*/
	for(v = 0; v < G.numVertexes; v++)
	{
		for(w = 0; w < G.numVertexes; w++)
		{
			(*D)[v][w] = G.arc[v][w];
			(*P)[v][w] = w; /*P[v][w] == w 的时候表明,v -> w 之间没有中转顶点了,初始化的时候肯定都是没有中转顶点的,所以都置为w*/
		}
	}
    /*以上完成了初始化工作*/
    /*注意三层for循环的次序,k作为中转顶点在第二层*/
	for(v = 0; v < G.numVertexes; v++)
	{
		for(k = 0; k < G.numVertexes; k++)
		{
			for(w = 0; w < G.numVertexes; w++)
			{
                /*如果顶点v到w的路径和 大于 顶点v到中转顶点k的路径和 + 顶点k到顶点w的路径和
                  就更新为小者,同时要更新v到w之间经过 [顶点v到顶点k之间的中转顶点]
                */
				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];/*路径设置为经过下标为k的顶点*/
				}
			}
		}
	}



	/*根据P数组打印路径的算法*/
	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);/*打印终点*/
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值