dijkstra算法记录路径 C++程序


在这里通过记录前驱来记录路径,但是不知道如何记录第二个点的前驱,因此通过初始化路径数组为9999的方法来判断....

#include <iostream>

#include <math.h>
#define Inf 9999
using namespace std;



/*******/
/*
函数说明:求最短路径,最短值,路径
参数1:传入一个二维数组,二维数组需为方阵,(int *)+数组名,这里参数为int型指针,传递时把二维数组名强制转换成int指针类型
 第i,j个数的值为*(c+i*m+j).
参数2:二维数组维数
参数3:欲求最短路径的起始点
参数4:欲求最短路径的终点
*/


void dijkstar(int *c,int m,int a,int b)
{
int size = m;
int min = 0;
int u;
int next = a;
int *dis = (int*)malloc(sizeof(int)*size);//使用malloc申请int*size大小的空间
int *book = (int*)malloc(sizeof(int)*size);
int *road = (int*)malloc(sizeof(int)*size);
for (int i = 0; i < size - 1; i++)
road[i] = 9999;              //初始化路径数组
for (int i = 0; i <= size-1; i++)  //保存a点到每个点的距离,0~8,共9个点
{
dis[i] = *(c + a*m + i);
//cout << dis[i] << endl;
}
//book数组初始化
for (int i = 0; i <= size - 1; i++)
{
book[i] = 0;
//cout << book[i] << endl;
}
book[a] = 1;
//dijkstra算法核心语句
for (int i = 0; i <= size - 2; i++)
{
min = Inf;


for (int j = 0; j <= size - 1; j++)
{
if (book[j] == 0 && dis[j] < min)
{
min = dis[j];
u = j;
}
}
book[u] = 1;
cout << "u的值为" << u << endl;


for (int v = 0; v <= size - 1; v++)
{
if (*(c + u*m + v) < Inf)
{
if (dis[v] > dis[u] + *(c + u*m + v))
{
dis[v] = dis[u] + *(c + u*m + v);
road[v] = u;
cout << v << "的前驱为" << road[v]<<endl;
}
}
}
}


//将结果输出
int outroad = b;
while (8 >= road[outroad] && road[outroad] >= 0)
{
cout <<"road[outroad]的值为"<<road[outroad] << endl;
outroad = road[outroad];
}
free(dis);
free(book);
free(road);




}


void main()
{
int c[9][9] =                            //设置路径数组,用于初始化
{
{ 0, 4, Inf, Inf, Inf, Inf, Inf, 8, Inf },
{ 4, 0, 8, Inf, Inf, Inf, Inf, 11, Inf },
{ Inf, 8, 0, 7, Inf, 4, Inf, Inf, 2 },
{ Inf, Inf, 7, 0, 9, 14, Inf, Inf, Inf },
{ Inf, Inf, Inf, 9, 0, 10, Inf, Inf, Inf },
{ Inf, Inf, 4, 14, 10, 0, 2, Inf, Inf },
{ Inf, Inf, Inf, Inf, Inf, 2, 0, 1, 6 },
{ 8, 11, Inf, Inf, Inf, Inf, 1, 0, 7 },
{ Inf, Inf, 2, Inf, Inf, Inf, 6, 7, 0 }
};
dijkstar((int*)c, 9, 3,0);
while (1);




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值