在这里通过记录前驱来记录路径,但是不知道如何记录第二个点的前驱,因此通过初始化路径数组为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);
}