1. 程式人生 > >[floyd+路徑輸出]HDU1385 Minimum Transport Cost

[floyd+路徑輸出]HDU1385 Minimum Transport Cost

矩陣 col targe click sca port hide php 技術

題目鏈接

題目翻譯:

有N個城市,然後直接給出這些城市之間的鄰接矩陣,矩陣中-1代表那兩個城市無道路相連,其他值代表路徑長度。

如果一輛汽車經過某個城市,必須要交一定的錢(可能是過路費)。

現在要從a城到b城,花費為路徑長度之和,再加上除起點與終點外所有城市的過路費之和。

求最小花費,如果有多條路經符合,則輸出字典序最小的路徑。

思考

題目給的是鄰接矩陣存圖,而且給出X個提問。大概率用Floyd寫是比較好的,字典序最小實現的話。

用Path數組實現 表示點i到j經過的第一個點

技術分享
#include <cstdio>
#include <cstring>
#include 
<iostream> const int INF = 999999999; const int MAXN=105; int n,path[MAXN][MAXN],charge[MAXN],W[MAXN][MAXN]; int x,y; void init(){ for(int i=0;i<=n;i++) for(int j=0;j<=n;j++){ if(i!=j) W[i][j] = INF; else W[i][j] = 0; path[i][j]=j; } }
void floyd(){ for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(W[i][k]!=INF && W[k][j]!=INF){ int ans = W[i][k]+W[k][j]+charge[k]; if(W[i][j]>ans){ W[i][j] = ans; path[i][j]
= path[i][k]; } else if(W[i][j]==ans && path[i][j]>path[i][k]){ path[i][j] = path[i][k]; } } } int main(){ while( scanf("%d",&n) && n){ init(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ scanf("%d",&W[i][j]); if(W[i][j]==-1) W[i][j] = INF; } for(int i=1;i<=n;i++) scanf("%d",&charge[i]); floyd(); while( scanf("%d%d",&x,&y) && (x!=-1 && y!=-1) ){ printf("From %d to %d :\n",x,y); printf("Path: "); int u = x; printf("%d",u); while(u!=y){ printf("-->%d",path[u][y]); u = path[u][y]; } puts(""); printf("Total cost : %d\n\n",W[x][y]); } } return 0; }
代碼實現

[floyd+路徑輸出]HDU1385 Minimum Transport Cost