POJ 1797 Heavy Transportation 解題報告

分類:圖論,生成樹,最短路,并查集
作者:ACShiryu
時間:2011-7-28
地址:ACShiryu's Blog
Heavy Transportation
Time Limit:?3000MSMemory Limit:?30000K
Total Submissions:?11929Accepted:?3171

Description

Background?
Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man who tells him whether there really is a way from the place his customer has build his giant steel crane to the place where it is needed on which all streets can carry the weight.?
Fortunately he already has a plan of the city with all streets and bridges and all the allowed weights.Unfortunately he has no idea how to find the the maximum weight capacity in order to tell his customer how heavy the crane may become. But you surely know.?

Problem?
You are given the plan of the city, described by the streets (with weight limits) between the crossings, which are numbered from 1 to n. Your task is to find the maximum weight that can be transported from crossing 1 (Hugo's place) to crossing n (the customer's place). You may assume that there is at least one path. All streets can be travelled in both directions.

Input

The first line contains the number of scenarios (city plans). For each city the number n of street crossings (1 <= n <= 1000) and number m of streets are given on the first line. The following m lines contain triples of integers specifying start and end crossing of the street and the maximum allowed weight, which is positive and not larger than 1000000. There will be at most one street between each pair of crossings.

Output

The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. Then print a single line containing the maximum allowed weight that Hugo can transport to the customer. Terminate the output for the scenario with a blank line.

Sample Input

1
3 3
1 2 3
1 3 4
2 3 5

Sample Output

Scenario #1:
4
題目大意是就是何處一個圖,n個頂點和m條邊,每個邊都有最大承載量,現在我要從1點運送貨物到n點,求能運送貨物的最大重量。
對于數據,第一行為t代表測試數據個數,第二行為n和m(意義見上),接著m行,每行三個整數分別是代表一條邊的起點,終點及最大承重量。輸出能運送貨物的最大重量,格式見樣例。注意數據輸完后還要再多輸一個空行。
對于數據,從1運到3有兩種方案
方案1:1-2-3,其中1-2承重為3,2-3承重為5,則可以運送貨物的最大重量是3(當大于3時明顯1到不了2)
方案2:1-3,可知1-3承重為4,故此路可運送貨物的最大重量是4,故答案輸出4
因為此前也沒做過圖論題,對一些算法都不熟,再剛開始題意理解有問題,WA了幾次,看懂題意后,搜了下別人的解題報告,說是Dijkstra的變形或這求最大生成樹。也許對Dijkstra運用(壓根就沒用過)的不是很熟,一直不知道怎么下手,連樣列都過不了。后就直接轉到求最大生成樹上去了,網上大部分代碼是Prim算法,由于《算法入門競賽經典》書沒介紹該算法,暫時還沒看,所以就選擇Kruskal求最大生成樹。然后選擇Kruskal的一個問題就是連通分量的處理,《入門經典》是用的并查集來處理,因為對生成樹算法不是很熟,就直接套的上面的模板。然后題目就是編程了求最大生成樹,并找出從1-n的最小權值的邊。當然,這棵樹不用搜完,因為,你從1到n不一定會每一個節點都走過,當將1-n連通時此時的權值就是所求的值;轉換用Kruskal時因為數組開大了MLE一次,開小了RE一次,最后決定還是動態分配靠譜些。不過因為一個小細節又WA了一次,最后改正,終于AC了,你說,AC一題我容易不!!!總之ACM搞圖論的上輩子都是折翼的天使!!!

2011072820212712.jpg

如果有時間,這題還會再做一遍的,用Prim算法和Dijkstra試一下!

參考代碼:

 1 //第一次提交的代碼基本是套模板的,和自己寫的出入較大,不習慣,將代碼修改下感覺也許更好!,第一次提交的代碼見最下面
2 #include<iostream>
3 #include<cstdlib>
4 #include<cstdio>
5 #include<cstring>
6 #include<algorithm>
7 #include<cmath>
8 using namespace std;
9 const int inf = (1<<20);
10 int p[1005]; //p是用于并查集的,r是用來存儲邊序號的
11 struct prog {
12 int w,v,u; //記錄起點,終點,權值
13 };
14 bool cmp(prog a,prog b)
15 {//間接排序函數,
16 return a.w>b.w;
17 }
18 int find(int x)
19 {//并查集里的find函數,你懂的
20 return p[x]==x?x:p[x]=find(p[x]);
21 }
22 int main()
23 {
24 int t;
25 cin >> t;
26 int k = 1;
27 while(t--)
28 {
29 int n ,m;
30 cin >> n >> m;
31 prog *r;
32 r=new prog[m];
33 int i ;
34 for ( i = 0 ; i < m ; i ++ )
35 cin>>r[i].u>>r[i].v>>r[i].w; //輸入邊的信息
36
37 for ( i =1 ; i <= n; i ++ )
38 p[i]=i;//初始化并查集
39
40 sort(r,r+m,cmp);//根據邊的權值的大小將邊的序號進行排序,r[i]表示第i+1大的邊存儲在u,v,w數組中的序號
41 int ans=inf; //將答案初始化為最大值
42 for ( i = 0 ; i < m ; i ++ )
43 {
44 int x=find(r[i].u);
45 int y=find(r[i].v);
46 if(x!=y)
47 {//如果該邊所在的兩邊不在同一個連通分量里,則連接該邊
48 if(ans>r[i].w)//如果該邊的權值比ans小(實際上一定不會比ans大),則更新ans
49 ans=r[i].w;
50 p[x]=y;//連接該邊
51 if(find(1)==find(n))//當1和n連通時,則說明找到了一條從1到n的路,并且可知該路的所有邊的權值都是最大的,故邊的最小權值就是答案
52 break;
53 }
54 }
55 //輸出答案,格式如題所述
56 cout<<"Scenario #"<<k<<":"<<endl;
57 cout<<ans<<endl<<endl;
58 k++;
59 }
60 return 0;
61 }

  附:第一次參考代碼

 1 #include<iostream>
2 #include<cstdlib>
3 #include<cstdio>
4 #include<cstring>
5 #include<algorithm>
6 #include<cmath>
7 using namespace std;
8 const int inf = (1<<20);
9 int *p,*r; //p是用于并查集的,r是用來存儲邊序號的
10 int *u,*v,*w; //分別代表邊的起點,終點,和權值,明顯不是我的風格,先熟悉下模板,不得不這樣寫
11 bool cmp(const int a,const int b)
12 {//間接排序函數,
13 return w[a]>w[b];
14 }
15 int find(int x)
16 {//并查集里的find函數,你懂的
17 return p[x]==x?x:p[x]=find(p[x]);
18 }
19 int main()
20 {
21 int t;
22 cin >> t;
23 int k = 1;
24 while(t--)
25 {
26 int n ,m;
27 cin >> n >> m;
28 int i ;
29 u=new int[m];
30 v=new int[m];
31 w=new int[m];
32 r=new int[m];//動態分配
33 for ( i = 0 ; i < m ; i ++ )
34 {
35 int a , b , c ;
36 cin>>a>>b>>c;
37 u[i]=a;
38 v[i]=b;
39 w[i]=c;//加入邊
40 }
41 p=new int[n+1];
42 for ( i =1 ; i <= n; i ++ )
43 p[i]=i;//初始化并查集
44 for ( i = 0 ;i < m ; i ++ )
45 r[i]=i;//初始化邊序號
46 sort(r,r+m,cmp);//根據邊的權值的大小將邊的序號進行排序,r[i]表示第i+1大的邊存儲在u,v,w數組中的序號
47 int ans=inf; //將答案初始化為最大值
48 for ( i = 0 ; i < m ; i ++ )
49 {
50 int e=r[i];//找到第i+1大的邊
51 int x=find(u[e]);
52 int y=find(v[e]);
53 if(x!=y)
54 {//如果該邊所在的兩邊不在同一個連通分量里,則連接該邊
55 if(ans>w[e])//如果該邊的權值比ans小(實際上一定不會比ans大),則更新ans
56 ans=w[e];
57 p[x]=y;//連接該邊
58 if(find(1)==find(n))//當1和n連通時,則說明找到了一條從1到n的路,并且可知該路的所有邊的權值都是最大的,故邊的最小權值就是答案
59 break;
60 }
61 }
62 //輸出答案,格式如題所述
63 cout<<"Scenario #"<<k<<":"<<endl;
64 cout<<ans<<endl<<endl;
65 k++;
66 }
67 return 0;
68 }

轉載于:https://www.cnblogs.com/ACShiryu/archive/2011/07/28/2119812.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275345.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275345.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275345.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

曾以為只能拿8K,22屆學弟字節校招心路歷程

大家好&#xff0c;我是若川。最近組織了源碼共讀活動《1個月&#xff0c;200人&#xff0c;一起讀了4周源碼》&#xff0c;已經有超50人提交了筆記&#xff0c;群里已經有超1500人&#xff0c;感興趣的可以點此鏈接掃碼加我微信 ruochuan12這篇文章記錄了江西師大學弟進入字節…

王者榮耀cpu測試軟件,你的手機能否玩王者榮耀,主流處理器新版王者榮耀測試...

說道國民級手游&#xff0c;目前來看那絕對是王者榮耀和刺激戰場&#xff0c;之前的話那可是王者榮耀的天下&#xff0c;甚至許多手機廠商在發布新手機的時候會專門公布王者榮耀的幀率&#xff0c;可見王者榮耀帶來的影響有多大。新版王者榮耀隨著王者榮耀的優化和手機系統、硬…

關于MFC遇到的一系列類型轉換問題

1.LPTSTR 轉換成 CString&#xff1a; (1)直接賦值 CString strText; LPTSTR lpszText _T("LPTSTR >> CString"); strText lpszText; ::MessageBox( NULL, strText , _T("標題"), MB_ICONASTERISK|MB_TASKMODAL|MB_OK );(2)CString::Format()格式化…

大蕭條時期什么行業走俏_大流行時期的用戶體驗

大蕭條時期什么行業走俏You’ve read a lot about uncertain times and social distancing. We’re all surrounded by the same words, but what exactly do they mean for the UX people? The nearest future is just the tip of the iceberg. The COVID-19 pandemic is lik…

vsftp虛擬用戶無法上傳文件,解決辦法

vsftp虛擬用戶無法上傳文件&#xff0c;解決辦法 1、打開/etc/vsftpd 目錄中的vsftpd.conf文件&#xff0c;查找&#xff1a;guest_usernamexxx&#xff0c;這里指的是vsftpd虛擬用戶對應的實 際系統用戶。 2、將該xxx用戶的R權限賦予想要上傳的目錄&#xff1a;chown -R xxx.x…

面試官問:來實現一個Promise

大家好&#xff0c;我是若川。最近組織了源碼共讀活動《1個月&#xff0c;200人&#xff0c;一起讀了4周源碼》&#xff0c;已經有超50人提交了筆記&#xff0c;群里已經有超1500人&#xff0c;感興趣的可以點此鏈接掃碼加我微信 ruochuan12 參與&#xff0c;一起學習&#xff…

奇跡暖暖服務器不穩定,閃耀暖暖用土豆當服務器?開服僅半小時就崩潰,無數玩家瘋狂吐槽...

大家好&#xff0c;這里是正驚游戲&#xff0c;我是你們的正驚小弟。繼奇跡暖暖之后&#xff0c;疊紙游戲的3D換裝類游戲《閃耀暖暖》于昨天正式開啟了全平臺公測。就在大家想要上游戲給女兒買好看的衣服時&#xff0c;發現游戲的服務器崩了&#xff0c;誰都登錄不上去&#xf…

D2 日報 2019年4月17日

? 新聞 ?? Is React Translated Yet? ¡S! Sim! はい&#xff01; react 文檔翻譯了多種語言reactjs.org? 開源項目 ?? formal/packages/formal-web at master kevinwolfcr/formal React Hooks 版本的 rc-form&#xff0c;集成了 React 表單組件通用的的非受控值緩…

nda協議_如何將NDA項目添加到您的投資組合

nda協議Being on the job hunt meant I needed to update my portfolio again. I had a new project to add, but it was under an NDA and I couldn’t say too much about it. Since I’ve never had to figure out how to display an NDA project on my portfolio before, I…

程序員一定會有35歲危機嗎?

大家好&#xff0c;我是若川。最近組織了源碼共讀活動《1個月&#xff0c;200人&#xff0c;一起讀了4周源碼》&#xff0c;已經有超50人提交了筆記&#xff0c;群里已經有超1500人&#xff0c;感興趣的可以點此鏈接掃碼加我微信 ruochuan12你好&#xff0c;我是黃老師。最近經…

hdu 2141 Can you find it? hdu1597 find the nth digit

hdu2141 唉&#xff0c;是我 想多了&#xff0c;用普通方法拼命剪枝&#xff0c;還是TLE 直接將前倆個數組的和求出來并保存&#xff0c;之后就是一個二分查找的過程了 二分的倆種寫法 第一種 #include<iostream>#include<algorithm>#include<string>using …

好程序員分享大勢所趨 HTML5成Web開發者最關心的技術

好程序員分享大勢所趨 HTML5成Web開發者最關心的技術&#xff0c;最近&#xff0c;在Stack Exchange上出現了一個比較熱門的問題&#xff1a;Web開發者最頭疼的問題是什么?結果并不是大家通常認為的兼容性問題&#xff0c;而是關于HTML5。  在所有與前端開發相關的技術中&am…

微軟bi 架構 服務器,微軟BI體系結構.

《微軟BI體系結構.》由會員分享&#xff0c;可在線閱讀&#xff0c;更多相關《微軟BI體系結構.(41頁珍藏版)》請在人人文庫網上搜索。1、Data Warehouse Data Access 前端報表用戶前端報表用戶 Data Sources Data Input Staging Area Data Marts 財務經理的視角財務經理的視角 …

網頁開發環境的重要性_少即是多:極簡方法在網頁設計中的重要性

網頁開發環境的重要性Written by Alan Smith由艾倫史密斯 ( Alan Smith)撰寫 Minimalism has been an increasingly popular trend in the web design world. Designers may be tempted by bolder, feature-rich design because it might seem like the best way to engage us…

聊聊前端八股文?

大家好&#xff0c;我是若川&#xff0c;點此加我微信進源碼群&#xff0c;一起學習源碼。同時可以進群免費看Vue專場直播&#xff0c;有尤雨溪分享「Vue3 生態現狀以及展望」前些天&#xff0c;我看到《劍指前端offer》一系列文章&#xff0c;被前言部分圖示和文章內容驚艷到。…

微服務神經元(Neural)

微服務架構中的神經組織&#xff0c;主要為分布式架構提供了集群容錯的三大利刃&#xff1a;限流、降級和熔斷。并同時提供了SPI、過濾器、JWT、重試機制、插件機制。此外還提供了很多小的黑科技(如&#xff1a;IP黑白名單、UUID加強版、Snowflake和大并發時間戳獲取等)。Featu…

flash跨域訪問解決辦法

今天一個客戶的flash程序突然無法訪問到數據&#xff0c;經過檢查發現當時做flash時&#xff0c;對訪問的數據使用了域名方式訪問&#xff0c;但是現在客戶又綁定了另一個域名&#xff0c;所以另一個域名訪問時就造成了跨域訪問&#xff0c;由于flash采用完全域匹配規則&#x…

服務器內存型號與頻率,一張圖看懂如何選擇DDR4內存的頻率和容量

Intel發布了代號為Skylake的第六代酷睿處理器&#xff0c;與此同時各大主板廠商也迅速推出基于100系列芯片組的各型號主板以迎接Skylake處理器&#xff0c;分別有Z170、H170及B150三個不同級別的芯片組。那針對著不同芯片組主板&#xff0c;如何選擇DDR4內存的頻率和容量&#…

Promise 到底是什么?看這個小故事

大家好&#xff0c;我是若川&#xff0c;點此加我微信進源碼群&#xff0c;一起學習源碼。還可以進《劍指前端offer》交流群。另外&#xff0c;可以進群免費看下周六Vue專場直播&#xff0c;有尤雨溪分享「Vue3 生態現狀以及展望」如果你還是一個 JavaScript 初學者&#xff0c…

docker 修改服務器,docker-修改容器掛載目錄的3種方法小結

本文關鍵詳細介紹了docker-修改容器初始化目錄的3種方式總結&#xff0c;具備非常好的實用價值&#xff0c;期待對大伙兒有一定的協助。一起追隨我回來瞧瞧吧方法一&#xff1a;修改配置文件(需停止docker服務)1、停止docker服務systemctl stop docker.service(重要&#xff0c…