多短图的最短路径问题-动态划分法

应用示例:
在车辆中安装了车辆导航系统,人们就可以不必为迷路、绕远而担心,只需点击所
在位置与目的地,路径规划会帮你找出到达目的地的最短路线。
路径规划是基于具有拓扑结构的道路网络,在车辆行驶前或行驶过程中寻找车辆
从起始点到达目的地的最佳行车路线的过程,它是多段图最短路径问题的典型应用。

对以下多段图,求出从原点1到终点10的最短路径。
多短图的最短路径问题-动态划分法
分析:
多短图的最短路径问题-动态划分法
第二行是cost数组,第三行是path数组

输入:
输入:
10 16
0 1 3
0 2 8
0 3 5
1 4 13
1 5 3
2 4 6
2 6 5
3 5 7
3 6 4
4 7 4
4 8 2
5 7 3
5 8 3
6 8 8
7 9 7
8 9 9

源代码:

#include <iostream>
using namespace std;
const int N = 20;
const int MAX = 1000;
int arc[N][N]; //存储弧上的权值

int CreatGraph(){
	int i,j,k;
	int weight;
	int vnum,arcnum;
    cout<<"请输入顶点个数和边的个数:";
	cin>>vnum>>arcnum;
	for(i=0;i<vnum;i++)
		for(j=0;j<vnum;j++)
			arc[i][j]=MAX;
	for(k=0;k<arcnum;k++){
		cout<<"请输入边的两个顶点和权值:";
		cin>>i>>j>>weight;
        arc[i][j]=weight;
	}
    return vnum;
}

int BackPath(int n){
	int i,j;
	int cost[N];int path[N];
	for(i=1;i<n;i++)
	{
		cost[i]=MAX;
		path[i]=-1;
	}
	cost[0]=0;path[0]=-1;
	for(j=1;j<n;j++){
		for(i=j-1;i>=0;i--)
		{
			if(arc[i][j]+cost[i]<cost[j])
			{
				cost[j]=arc[i][j]+cost[i];
				path[j]=i;
			}
		}
	}
	cout<<"路径是倒序:";
	cout<<n;
	i=n-1;
	while(path[i]>=0){
		cout<<"<-"<<path[i]+1;
		i=path[i];
	}
	return cost[n-1];
}

int main()
{     int n = CreatGraph( );
      int pathLen = BackPath(n);
      cout<<endl<<"最短路径的长度是:"<<pathLen<<endl;
      return 0;
}

运行结果:
多短图的最短路径问题-动态划分法

时间复杂度:理论时间复杂度:O(m+k)–(m为边数个数,k为划分段数),
实际时间复杂度O(n^2)