用一个n行2列的数组res[n][2]来存结果即可,其中第一列存到源点start_p的距离,第二列存改点到源点最短路径的前一个节点。
每一次在加入节点都是加入的当前时刻距离源点距离最近的那个点。
#include <iostream>
#include <stdio.h>
using namespace std;
#define INF 10000
int edge[1000][1000];
int res[1000][2];
int visit[1000];
void dij(int start_p,int p_num)
{
int p = start_p;
//一共有n - 1个点的距离
visit[p] = 1;
for(int i = 0; i < p_num - 1; i++)
{
int min = INF;
int min_p;
for(int j = 0; j < p_num; j++)
{
if(edge[p][j] && !visit[j])//p到j有边且j未被访问 ,判断是否更新点j的路径
{
if(res[j][0] == 0 || res[j][0] > res[p][0] + edge[p][j])
{
res[j][0] = res[p][0] + edge[p][j];
res[j][1] = p;
}
}
//从所有点中找到到start_p最近的点作为下一个起始点 rea[j][0]证明还没能访问
if(!visit[j] && res[j][0] < min && res[j][0] != 0)
{
min = res[j][0];
min_p = j;
}
}
p = min_p;
visit[p] = 1;
}
}