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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

bnuoj 20950 沉重的货物 (最小生成树)

發布時間:2025/3/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bnuoj 20950 沉重的货物 (最小生成树) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

沉重的貨物

? ? ? ? ? ? ? Time Limit:?1000ms ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??Memory Limit:?65536KB 64-bit integer IO format:?%lld????? Java class name:?Main

?

CUITCPC是一個專門生產大型貨運火車的工廠。他們的新型貨運火車XX V1.0,是如此之大,以至于可以運輸的貨物的重量并不取決于那個火車本身,而只是受限于你所通過的鐵路的承重。

給你出發和目標城市,你的任務就是求出火車從初始城市到目標城市的最大載重。

Input

?

輸入可能包括一組或者多組測試數據。每一個測試數據的前兩行是兩個整數:城市的數量n(2<=n<=1000)和鐵路的條數r(1<=r<= 19900)。

緊接著是r行,每一行描述一條連接兩個城市的鐵路以及這段鐵路所能承受的最大重量。城市名不會超過30個字符,也不會有空白字符出現在城市名中。承重是一個0-10000的整數。鐵路都是雙向的。

最后一行是兩個城市的名字:初始城市和目標城市。

輸入的結束條件是n和r都為0

Output

?

對于每一組測試數據

輸出包括3行:

l? 一行輸出"Scenario #x",其中x是測試數據的組數

l? 一行輸出"y tons",其中y表示最大載重量

l? 一個空行

Sample Input

4 3 ACM ICPC 100 ICPC World 80 World CPC 120 ACM CPC 5 5 ACM ICPC 100 ICPC World 80 World CPC 120 ACM Chengdu 220 Chengdu CPC 170 CPC ACM 0 0

Sample Output

Scenario #1 80 tonsScenario #2 170 tons

這是昨天晚上比賽的一道題,個人感覺這題還不錯,只可惜當時沒有做出來。讀完題看出來了是一道最大流的題目,但我沒有仔細的學過網絡流,我按照書上的模板打完之后又發現不能直接套模板。比賽完聽隊友說也可以用最小生成樹或者搜索來做,看來我想的太少了。

今天用最小生成樹的思想寫了一下這個題,每次往集合中添加一個距離起點最遠的點,直到把終點添加進去,然后從這些邊中選擇一個最小值就是所求的答案。也許你會問:把終點添加進去就結束,那其他沒有添加的點怎么辦?會不會影響最終結果? ?答案是不會。因為我們要求的是最大值,每次添加的都是較長的邊,即使通過其他路徑可以到達終點,但是通過其他路徑得到的最大值肯定不會超過我們求出的結果。 #include<iostream> #include<cstring> #include<string> #include<map> using namespace std; const int INF = 0x3fffffff; const int N = 1e4; int n, m, Min; int cap[N][N], low[N], vis[N]; void Init(int n) {for(int i = 0; i <= n; i++)for(int j = 0; j <= n; j++)cap[i][j] = -INF; } void Prim(int s, int e) {int i, j;memset(vis, 0, sizeof(vis));memset(low, -1, sizeof(low));for(i = 1; i <= n; i++)if(cap[s][i] != -INF)low[i] = cap[s][i];vis[s] = 1;for(i = 1; i < n; i++){int mmax = -1, pos;for(j = 1; j <= n; j++)if(!vis[j] && low[j] > mmax)mmax = low[pos = j];if(mmax == -1) break; //此句可加可不加,執行此句時肯定加入了已經n-1條邊Min = Min < mmax ? Min : mmax;if(pos == e) break;vis[pos] = 1;for(j = 1; j <= n; j++)if(!vis[j] && cap[pos][j] > low[j])low[j] = cap[pos][j];} } int main() {int i, j, t, w, cas = 1;map<string, int> mp;string str1, str2;while(cin >> n >> m){if(!n && !m) break;Min = INF;mp.clear();Init(n);t = 1;for(i = 0;i < m; i++){cin >> str1 >> str2 >> w;if(mp.find(str1) == mp.end())mp[str1] = t++;if(mp.find(str2) == mp.end())mp[str2] = t++;int x = mp[str1], y = mp[str2];cap[x][y] = cap[y][x] = w;}cin >> str1 >> str2;Prim(mp[str1], mp[str2]);cout << "Scenario #" << cas++ << endl;cout << Min << " tons" << endl;cout << endl;}return 0; }

總結

以上是生活随笔為你收集整理的bnuoj 20950 沉重的货物 (最小生成树)的全部內容,希望文章能夠幫你解決所遇到的問題。

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