1261:【例9.5】城市交通路網
阿新 • • 發佈:2019-01-13
1261:【例9.5】城市交通路網
時間限制: 1000 ms 記憶體限制: 65536 KB
提交數: 1387 通過數: 1029
【題目描述】
下圖表示城市之間的交通路網,線段上的數字表示費用,單向通行由A->E。試用動態規劃的最優化原理求出A->E的最省費用。
如圖:求v1到v10的最短路徑長度及最短路徑。
【輸入】
第一行為城市的數量N;
後面是N*N的表示兩個城市間費用組成的矩陣。
【輸出】
A->E的最省費用。
【輸入樣例】
10
0 2 5 1 0 0 0 0 0 0
0 0 0 0 12 14 0 0 0 0
0 0 0 0 6 10 4 0 0 0
0 0 0 0 13 12 11 0 0 0
0 0 0 0 0 0 0 3 9 0
0 0 0 0 0 0 0 6 5 0
0 0 0 0 0 0 0 0 10 0
0 0 0 0 0 0 0 0 0 5
0 0 0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0 0 0
【輸出樣例】
minlong=19
1 3 5 8 10
【來源】
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 100 #define inf 1e9 int a[maxn][maxn]; int f[maxn]; int pre[maxn]; using namespace std; int main() { int n; scanf("%d",&n); memset(a,0,sizeof(a)); memset(pre,0,sizeof(pre)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); for(int i=1;i<=maxn;i++) f[i]=inf; f[n]=0; for(int i=n-1;i>=1;i--) for(int j=i+1;j<=n;j++) { if(a[i][j]>0&&f[j]!=inf&&f[i]>a[i][j]+f[j]) {f[i]=f[j]+a[i][j]; pre[i]=j; } } printf("minlong=%d\n",f[1]); int k=1; while(k!=0) { printf("%d ",k); k=pre[k]; } printf("\n"); }