问题描述,如图所示的
解决该问题从节点1-->节点8的最短路径以及其最短距离.
利用动态规划的思想:
1、将图进行分层,如图所示的路径中可以分为4层,第一层为1,第二层为3/5/6,第三层为2/4/7,第四层为8
2、从终点开始向起点进行回溯,首先看第三层各元素到节点8的最短距离,然后计算第二层到节点8的最短距离是采用第二层到第三层个节点的距离加上第二层各节点到节点8的距离最短值
3、最终回溯到起点结束,动态规划完成。
具体实现代码如下:
#include<stdio.h>
#include<string.h>
char element[100][100]; //储存位置的元素信息
int distant[100][100][100]; //储存该位置到下一层各元素的距离
int min[100][100][100]; //动态规划中的最小距离
int elementnum1[100]; //每一层的元素个数
int main(void)
{
char terminal;
int layernum = 0,elementnum = 0;
int i = 0,j = 0,k = 0,l = 0;
int m=0,t=0;
int minlocate=0;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
for(k=0;k<10;k++)
{
min[i][j][k]=0;
distant[i][j][k]=10000;
}
printf("欢迎使用最短路径动态规划系统
");
// -------------图的构造部分--------------
printf("本次规划共有层数:");
scanf("%d",&layernum);
for(i=0;i<layernum;i++)
{
printf("请输入第%d层元素个数:",i+1);
scanf("%d",&elementnum);
elementnum1[i]=elementnum;
for(j=0;j<elementnum;j++)
{
printf("请输入第%d个元素:",j+1);
scanf(" %c",&element[i][j]);
printf("请输入该元素与后一层的连接关系个数:");
scanf("%d",&m);
for(l=0;l<m;l++)
{
printf("请输入该元素与后一层的连接关系(例如输入1,2则表示与后一层的第1个元素的距离为2):");
scanf("%d",&k);
scanf("%d",&distant[i][j][k-1]);
}
}
}
printf("请输入终点:");
scanf(" %c",&terminal);
for(j=elementnum-1;j>=0;j--)
{
if(terminal==element[layernum-1][j])
break;
}
if(j<0)
printf("该元素不能作为终点!");
minlocate=j;
//------------------动态规划部分---------------------
for(i=layernum-1;i>=0;i--) //倒叙运算方式,从终点开始回溯
{
for(j=0;j<elementnum1[i];j++)
{
if(terminal==element[i][j])
min[i][j][minlocate]=0;
else
min[i][j][minlocate]=10000;
for(k=0;k<elementnum1[i+1];k++)
{
t = distant[i][j][k]+min[i+1][k][minlocate]; //核心算法:此点到终点的最短距离等于此点到后一层的距离加上后一层到终点的距离
if(t<min[i][j][minlocate])
{
min[i][j][minlocate] = t;
}
}
printf("元素%c到终点的最短路径为%d
",element[i][j],min[i][j][minlocate]);
}
}
return 0;
}