[floyd+路徑輸出]HDU1385 Minimum Transport Cost
阿新 • • 發佈:2017-06-07
矩陣 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