bnuoj 20950 沉重的货物 (最小生成树)
生活随笔
收集整理的這篇文章主要介紹了
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 0Sample 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 沉重的货物 (最小生成树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker 从入门到掉坑
- 下一篇: 没想到,这么简单的线程池用法,深藏这么多