日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划求解多段图最短路径

發布時間:2023/12/29 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划求解多段图最短路径 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動態規劃求解多段圖最短路徑

題目:

分析見源代碼注釋
源代碼:

#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; }

總結

以上是生活随笔為你收集整理的动态规划求解多段图最短路径的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。