//看代码时需要提前理解的
//我们用一个一维数组怎么存储起点到其余所有点的多条最短路径
//我们只需要记录起点s到某个节点N的最短路径的最后一个中间节点K
//找到K后在找到s到K的最短路径的最后一个中间节点L,如此反复就可以找到路径
//所以一条路径只要记录一个点,一个一维数组就可以搞定了
#include<iostream>
#include<vector>
#define Max 100000
using namespace std;
void dijkstra(vector<vector<int>> &arcs,//邻接矩阵 矩阵在函数外按算法初始化 邻接矩阵应该是对称的
vector<int> &dist,//存储最短路径的,初始化为-1,长度为节点个数
int start//这是起点,所有起点0开始编号,100个起点就是0-99,
//arcs[i]就是第i个起点到各个相邻,注意只是给了相邻起点的距离,arcs[i][i]==0
)
{
int nm_length = arcs.size();//得到邻接矩阵的边长
//这里的代码应该是做邻接矩阵、参数是否符合要求的
{
//我就省略了
}
//定义bool数组 标志该节点是否走过 并初始化为false
bool *cover_node=new bool[nm_length];
for (int i = 0; i < nm_length; i++)
cover_node[i] = false;
//dist数组是储存路径的 并初始化为-1
//int *dist = new int[nm_length];
for (int i = 0; i < nm_length; i++)
{
dist[i] = -1;
}
//开始不断找距离源点start最近的点距离
while(true)
{
int min = Max; int min_index = start;
for (int i_temp = 0; i_temp < nm_length; i_temp++)
{
if (i_temp != start&& !cover_node[i_temp])//不需要源点自身的比较并且不能是走过的节点
{
if (arcs[start][i_temp] < min)
{
min = arcs[start][i_temp];
min_index = i_temp;
}
}
}
//已经找到最小点了,如果发现min=Max,可以退出 因为所有点都走过了
if (min == Max)
break;
//如果找到最小节点发现为-1,证明他是由start直接走到的,则他最短路径的最后一个节点就是start
if (dist[min_index] == -1)
dist[min_index] = start;
//找到最小节点后要更新邻接矩阵
for (int i_temp1 = 0; i_temp1 < nm_length; i_temp1++)
{
if (arcs[start][min_index] + arcs[min_index][i_temp1] < arcs[start][i_temp1])
{
arcs[start][i_temp1] = arcs[start][min_index] + arcs[min_index][i_temp1];
dist[i_temp1] = min_index;//这一步路径的更新意味着到达i_temp1的最短路径最后一个点是min_index
}
}
//走过后要把最小点要标记为true
cover_node[min_index] = true;
}
//最后arcs[start]一行就是到各点最短路径
//根据dist就能找到最短路径,当然这里要你理解dist的储存最短路径方式你才能知道怎么找
//如果还不理解就自己再看多几次,拿笔画画
}