时间复杂度为O(m+k):m为边的数目,k为段的数目。
#include<iostream>
using namespace std;
#define INF 999
int arc[100][100]; // 最多100个点
int CreateGraph()
{
int vnum,arcnum;
cout<<"请输入顶点和边的个数:"<<endl;
cin>>vnum>>arcnum;
for(int i=0;i<vnum;i++){ // 初始化边的权值
for(int j=0;j<vnum;j++){
arc[i][j] = INF;
}
}
int weight;
for(int k=0;k<arcnum;k++){
int i,j;
cout<<"请输入第"<<k+1<<"条边的两个顶点和权值:"<<endl;
cin>>i>>j>>weight;
arc[i][j] = weight;
}
return vnum; // 返回顶点的个数(传入BackPath函数中)
}
// 求 n个顶点的多段图的最短路径
int BackPath(int n)
{
int i,j,temp;
int cost[100],path[100]; // 存储路径长度和路径
for(i=1;i<n;i++){
cost[i] = INF;
path[i] = -1;
}
// 顶点0为源点
cost[0] = 0;
path[0] = -1;
for(j=1;j<n;j++){ // 依次计算后面下标为1到n-1的点(填表)
for(i=j-1;i>=0;i--){
if(cost[i]+arc[i][j]<cost[j]){
cost[j] = cost[i]+arc[i][j]; // 更新值
path[j] = i; // 记录前一个点
}
}
}
// 输出路径
i = n-1;
cout<<i;
while(path[i]>=0){ // 前一个点大于0
cout<<"<-"<<path[i];
i = path[i]; // 更新为前一个点
}
cout<<endl;
return cost[n-1]; // 返回最短路径长度
}
int main()
{
cout<<"最短路径长度为:"<<BackPath(CreateGraph())<<endl;
return 0;
}