C語言及程序設計進階例程-28 動態規划法問題求解


賀老師教學鏈接 C語言及程序設計進階 本課講解

最短路徑問題

#include<stdio.h>
#define n 7
#define x 9999 /*用一個盡可能大的開銷,代表結點之間沒有通路*/
int map[n][n]= /*對圖7.33中交通網的描述,map[i][j]代表i結點到j結點的開銷*/
{
{x,4,5,8,x,x,x},
{x,x,x,6,6,x,x},
{x,x,x,5,x,7,x},
{x,x,x,x,8,9,9},
{x,x,x,x,x,x,5},
{x,x,x,x,x,x,4},
{x,x,x,x,x,x,x}
};

int main()
{
int cost[n]; /*記錄出發點到每個結點的最短路徑*/
int path[n]= {0}; /*記錄到達各個結點的最短路徑中,上一個結點的編號*/
int i,j;
int minCost, minNode;
cost[0]=0; /*出發點到自己的開銷為0*/
for(i=1; i<n; i++) /*循環過程中,求出到每個結點的最小開銷,並且記錄使開銷最小的前一結點*/
{
minCost=x;
for(j=0; j<i; j++)
{
if(map[j][i]!=x)
if((cost[j]+map[j][i])<minCost)
{
minCost=cost[j]+map[j][i];
minNode=j;
}
}
cost[i]=minCost;
path[i]=minNode;
}
printf("最短路徑的開銷為: %d\n",cost[n-1]); /*輸出最短路徑的開銷*/

printf("從終點向前推,最短路徑經過了: ");
i = n-1; /*n-1就是終點的編號,本例中,n值為7*/
while(i!=0)
{
printf(" %d",path[i]); /* 輸出最短路徑上前一個結點的編號*/
i = path[i]; /*從剛輸出的結點,再循環向前倒推*/
}
printf("\n");
return 0;
}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com