动态规划求解多段图最短路径
题目:
分析见源代码注释
源代码:
#include<stdio.h>
#define N 10//定义定点数,编号从1开始
#define M 5//定义层数
#define INF 0x3f3f3f
int graph[100][100];//图的链接矩阵
int num[5] = { 1,4,7,9,10 };//每一层对应的节点最大编号,用于区分每一层
int cost[N+1];//每一个节点从起点到该节点的最短距离
int pos[N + 1];//每一个节点对应最短距离的上一节点,用于后续输出最短路径
void map()
{
int i,x;
for (i = 0; i < M-1; i++)//对应每一层,从第二层开始
{
x = num[i] + 1;
while (x <= num[i + 1])//每一层的每个节点
{
for (int j = 1; j <= 10; j++)//遍历与该节点有链接关系的上一层节点
{
if (graph[j][x] != 0)
{
int y = graph[j][x] + cost[j];//该层节点与上一层节点间距离+起点到上一层的最短距离
if (y < cost[x])//比较大小,求出起点到该节点的最短距离
{
cost[x] = y;
pos[x] = j;
}
}
}
//printf("%d ", cost[x]);//输出每一个节点对应的最短路径代价
x++;
}
}
}
void showpath()//输出最短路径
{
int i = N,j=0;
int a[M-1];
while (i > 1)
{
a[j++] = pos[i];
i = pos[i];
}
printf("最短路径为:");
for (i = M - 2; i >= 0; i--)
printf("%d->", a[i]);
printf("%d\n",N);
}
int main()
{
for (int i = 1; i <= N; i++)
{
cost[i] = INF;
pos[i] = 1;
}
cost[1] = 0;
pos[1] = 0;
for (int i = 1; i <= N; i++)
for (int j = 0; j <= N; j++)
graph[i][j] = 0;
graph[1][2] = 4; graph[1][3] = 2; graph[1][4] = 3;//初始化
graph[2][5] = 10; graph[2][6] = 9;
graph[3][5] = 6; graph[3][6] =7; graph[3][7] =10;
graph[4][6] = 3; graph[4][7] =8;
graph[5][8] = 4; graph[5][9] = 8;
graph[6][8] = 9; graph[6][9] =6;
graph[7][8] = 5; graph[7][9] = 4;
graph[8][10] = 8;
graph[9][10] = 4;
map();
showpath();
printf("代价为:%d", cost[N]);
return 0;
}