动态规划——多段图的最短路径

问题描述

在这里插入图片描述
在这里插入图片描述

源码

#include<stdio.h>
#include<stdlib.h>
const int INF = 1000;
const int N = 100;//图的最大结点数为100
int arc[N][N];//图的代价矩阵
int cost[N];//存储路径长度
int path[N];//路径
int ClosetPath(int n) {
 int i,j,temp;
 for(i=1; i<n; i++) {
  cost[i]=INF;
  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;
   }
  }
 }
 return cost[n-1];
}
void printPath(int i) {
 if(i!=-1) {
  printPath(path[i]);
  printf("%d-",i);
 }
}
int main() {
 int i,j,n,m;
 //printf("请输入结点个数和边个数:");
 //scanf("%d%d",&n,&m);
 n=10;
 m=18;
 for(i=0; i<n; i++)
  for(j=0; j<n; j++)
   arc[i][j]=INF;
// for(i=0;i<m;i++){
//  int a,b,c;
//  printf("请输入边的两个顶点计权重:");
//  scanf("%d%d%d",&a,&b,&c);
//  arc[a][b]=c;
// }
 arc[0][1]=4;
 arc[0][2]=2;
 arc[0][3]=3;
 arc[1][4]=9;
 arc[1][5]=8;
 arc[2][4]=6;
 arc[2][5]=7;
 arc[2][6]=8;
 arc[3][5]=4;
 arc[3][6]=7;
 arc[4][7]=5;
 arc[4][8]=6;
 arc[5][7]=8;
 arc[5][8]=6;
 arc[6][7]=6;
 arc[6][8]=5;
 arc[7][9]=7;
 arc[8][9]=3;
 int min = ClosetPath(n);
 for(i=0;i<n;i++)
  printf("%3d",path[i]);
 printf("\n最短路径为:");
 printPath(path[n-1]);
 printf("%d",n-1);
 printf("\n最短距离:%d",min);
 return 0;
}

猜你喜欢

转载自blog.csdn.net/The_Only_God/article/details/105527411