含有约束条件下的最短路径问题
程序框图及变量说明
程序框图
常量:
N——所选节点个数
MAX——定义两点之间若无路径赋予的最大值
变量:
DIST[N]——存储已经搜寻到的最短路径
Is[N]——存储节点是否被遍历的状态
Path[N]——图之间的路径矩阵
Road[N]——存储最短路径时该节点的上一节点
算法解释
该程序遍历N个点,故总遍历次数应为N-1
第一个循环为标点:找到未标注点中距离起点最小的点将其标号;
第二个循环为更新未标注点到起点的最短路径:基于第一个循环新标出的点,更新余下点中的最短路径。直到遍历到终点程序结束。
所用数据
这是上海到广州中28个城市之间的公路距离,在这里拟求上海到广州之间的最短路径
代码实现
#include <iostream>
//假设取10个节点,N=28
//定义无穷大为100000
#define N 28
double distance[N];//最短路径
int path[N];//上一节点
int is[N];//是否选用该节点,0位未选用
double destination[N][N]={
{
0, 97.9, 100000, 100000, 227.2, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000},//1
{
97.9, 0, 84.5, 106.1, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000},//2
{
100000, 84.5, 0, 56.7, 100000, 221.4, 176.3, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000},//3
{
100000, 106.1, 56.7, 0, 121.2, 100000, 164.1, 100000, 276.6, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000},//4
{
100000, 100000, 100000, 121.2, 0, 100000, 244.2, 100000, 273, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000},//5
{
100000, 100000, 100000, 100000, 100000, 0, 100000, 100000, 100000, 143.7, 166.5, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000, 100000