最短路径问题很是经典,本文也不对原理做介绍了有太多大佬,我讲得不好
只介绍一种算法模板(结点从下标0开始)
void DIG(int start, int end) //计算结点start到end的最短路径
{
//初始化visited数组
memset(visited, 0, sizeof(visited)); //刚开始谁都没访问过,cstring头文件
for (int i = 0; i < vex; ++i) {
dist[i] = value[start][i]; //源点start到各个结点的最小距离
}
//将源点放到最短路径结点集合中
visited[start] = 1;
//更新最短距离数组
dist[start] = 0;
int num = 1; //每一轮循环将一个数值放入到最短路径结点集合中
while (num < vex)
{
//找出剩余节点中路径最短的结点
int minn = inf;
int t_i = 0; //记录最短路径结点的下标
for (int i = 0; i < vex; ++i) {
//前提是不在最短路径结点集合中
if (visited[i] == 0 && minn > dist[i]) {
minn = dist[i]; //就是那个最短路径的数值
t_i = i;
}
}
//将刚刚找到的节点加入到集合中
visited[t_i] = 1; //已经标记了
num++; //最短路径结点结合中结点数加1
//将这个结点加入到路径中后,更新所有节点到源点地最短路径
for (int i = 0; i < vex; ++i) {
//对非集合中的节点的最短路径进行更新
if (visited[i] == 0 && (dist[i] > dist[t_i] + value[t_i][i]))
{
//原来源点距离i的距离大于刚刚取得结点的最短路径加上该点至i的路径距离
dist[i] = dist[t_i] + value[t_i][i];
}
}
}
//输出重点end的最短路径 ---判断一下end值是否有效
if (end >= 0 && end < vex) {
cout << dist[end] << endl;
}
}
需要注意的点:
1.若两个点未连接,则设为inf(无穷大)
2.初始化标记数组visited,可以用memset函数,头文件cstring
3.最关键的思想就是:找出未加入最短路径结点集合中结点,然后更新最短路径数组dist中源节点至各个节点的最短路径【超级重要】
4.后续更新