Dijkstra算法思想及实现以及输出具体路径

这个和我上一篇随笔差不多,只是不仅要知道给定点到所有其他点的最短路径,而且还要把路径给数出来,思想很好理解,如图:

顶点1到5的最短路径是14,具体路径是1-->4-->6-->5这个先后顺序是如何确定的?其实很简单,当你用Dijstra算法跑过一遍后,那么D[i]里的值就应该是最新的,也就是给定点到其他所有点的最短路劲长度已经确定了(下标从0开始),D[0]=0,D[1]=5,D[2]=9,D[3]=7,D[4]=14,D[5]=13,所以从这就可以看出D[5]<D[4],所以6在5的前面通过前面求出来的P[i][j]数组可以知道所要经过的点,而有D[i]数组又可以知道前后顺序,及要想输出路径,只要将所经过的点按D[i]的大小排序后再按从小到大的顺序输出即可。说的简单一点,也就是说这条路径上的点到源点的路径是在递增的,这个好理解吧,所以重点就在如何排序

定义一个结构体,用来保存节点到始点的路径长度和在图中的位置

typedef struct		//路径结构体
{
	int index;
	int weight;
}path;

  路径只可能越来越长,所以按weight排序没有相同的元素,用qsort是稳定的,qsort比较函数

int comp(const void *a,const void *b)	//qsort比较函数
{
	return (*(path *)a).weight-(*(path *)b).weight;
}

  关键代码在输出部分

	for (i=0;i<g->vexnum;i++)
	{
		if (i!=v0)
		{
			printf("路径长度为:%d 路径为:",D[i]);
			int k=0,j;
			for (j=0;j<g->vexnum;j++)
			{
				if (P[i][j]==1&&(i!=j))
				{
					path_point[k].index=j;
					path_point[k++].weight=D[j];
				}
			}
			path_point[k].index=i;
			path_point[k++].weight=D[i];
			qsort(path_point,k,sizeof(path),comp);
			for (j=0;j<k;j++)
			{
				if (j==0)
				{
					printf("%c",g->vexs[path_point[j].index]);
				}
				else
				{
					printf("-->%c",g->vexs[path_point[j].index]);
				}				
			}
			printf("\n\n");
		}
	}

  项目的完整代码如下:

/*graph.h*/
//---------图的数组(邻接矩阵)存储表示----------
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#define INFINITY  10000        //最大值
#define MAX_VERTEX_NUM 20        //最大顶点个数  
typedef int VRType;        
typedef 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值