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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

nyoj 931 货物运输(Floyd输出路径)

發布時間:2025/3/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nyoj 931 货物运输(Floyd输出路径) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

貨物運輸

時間限制:1000?ms ?|? 內存限制:65535?KB 難度:4 描述

S國有n個城市,從a城到b城運貨的花費有兩部分組成:

(1)a城到b城的運輸費

(2)途徑城市的稅收

例如:a?運貨到?b,走路線a?>?i?>?j?>?b?,總花費為a?到?i?i?到?jj?到?b?的運輸費、ij?城市的稅收之和。

已知任意兩個城市的運輸費用,每個城市的稅收,計算出,城市ab的最小運輸費。

輸入
多組數據。
第一行輸入整數n(n不大于200,城市從1開始編號)
接下來輸入n行n列的矩陣M,Mij 表示 i 城市到 j 城市的運輸費,-1表示這兩個城市不能直接到達。
第n+2 行 輸入n個整數,第i個整數代表第i個城市的稅收。
第n+3 行 輸入整數m,表示有m次詢問(m不大于200)。
接下來m行,每行輸入兩個整數u, v。
輸出
對于每次詢問
輸出如下:
From u to v :
Path: u-->c1-->......-->ck-->v
Total cost :?

............

From e to f :
Path: e-->e1-->..........-->ek-->f
Total cost : ......


Note: 如果有多種路徑方案,輸出字典序最小的,每次詢問后加一個換行。a城市到a城市的運費不一定為0
樣例輸入
4 0 5 15 -1 5 0 5 8 15 10 2 5 -1 -1 8 0 5 3 7 1 3 1 3 2 4 3 1
樣例輸出
From 1 to 3 : Path: 1-->2-->3 Total cost : 13From 2 to 4 : Path: 2-->4 Total cost : 8From 3 to 1 : Path: 3-->1 Total cost : 15


解題思路:Floyd+路徑輸出

#include<iostream> #include<cstdio> #include<cstring> using namespace std;const int maxn = 200; const int inf = 0x3f3f3f3f; int n,m,dis[maxn][maxn],tax[maxn]; int path[maxn][maxn]; // 用path[i][j] 記錄路徑i-->j的i的下一個經過的節點。 // 這樣的話,如果說一條路徑是這樣的: i->a->b->j // 那path的值就是: path[i][j] = a , path[a][j] = b , path[b][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(dis[i][j] > dis[i][k] + dis[k][j] + tax[k]){path[i][j] = path[i][k];dis[i][j] = dis[i][k] + dis[k][j] + tax[k];}else if(dis[i][j] == dis[i][k] + dis[k][j] + tax[k]){if(path[i][j] > path[i][k])path[i][j] = path[i][k];}} }int main() {int a,b;while(scanf("%d",&n)!=EOF){for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++){scanf("%d",&dis[i][j]);if(dis[i][j] != -1)path[i][j] = j;else dis[i][j] = inf;}for(int i = 1; i <= n; i++)scanf("%d",&tax[i]);floyd();scanf("%d",&m);while(m--){scanf("%d %d",&a,&b);printf("From %d to %d :\n", a, b); if(a == b) printf("Path: %d\n", a);else{printf("Path: %d-->", a); int next = path[a][b];while(next != b){printf("%d-->", next); next = path[next][b]; }printf("%d\n",b);}printf("Total cost : %d\n", dis[a][b]); printf("\n"); }}return 0; }


與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的nyoj 931 货物运输(Floyd输出路径)的全部內容,希望文章能夠幫你解決所遇到的問題。

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