生活随笔
收集整理的這篇文章主要介紹了
动态规划求解多段图最短路径
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
動態規劃求解多段圖最短路徑
題目:
分析見源代碼注釋
源代碼:
#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;
}
總結
以上是生活随笔為你收集整理的动态规划求解多段图最短路径的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。