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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

201703-4 地铁修建

發布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 201703-4 地铁修建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述

試題編號:201703-4
試題名稱:地鐵修建
時間限制:1.0s
內存限制:256.0MB
問題描述: 問題描述 A市有n個交通樞紐,其中1號和n號非常重要,為了加強運輸能力,A市決定在1號到n號樞紐間修建一條地鐵。
  地鐵由很多段隧道組成,每段隧道連接兩個交通樞紐。經過勘探,有m段隧道作為候選,兩個交通樞紐之間最多只有一條候選的隧道,沒有隧道兩端連接著同一個交通樞紐。
  現在有n家隧道施工的公司,每段候選的隧道只能由一個公司施工,每家公司施工需要的天數一致。而每家公司最多只能修建一條候選隧道。所有公司同時開始施工。
  作為項目負責人,你獲得了候選隧道的信息,現在你可以按自己的想法選擇一部分隧道進行施工,請問修建整條地鐵最少需要多少天。 輸入格式 輸入的第一行包含兩個整數n, m,用一個空格分隔,分別表示交通樞紐的數量和候選隧道的數量。
  第2行到第m+1行,每行包含三個整數a, b, c,表示樞紐a和樞紐b之間可以修建一條隧道,需要的時間為c天。 輸出格式 輸出一個整數,修建整條地鐵線路最少需要的天數。 樣例輸入 6 6
1 2 4
2 3 4
3 6 7
1 4 2
4 5 5
5 6 6 樣例輸出 6 樣例說明 可以修建的線路有兩種。
  第一種經過的樞紐依次為1, 2, 3, 6,所需要的時間分別是4, 4, 7,則整條地鐵線需要7天修完;
  第二種經過的樞紐依次為1, 4, 5, 6,所需要的時間分別是2, 5, 6,則整條地鐵線需要6天修完。
  第二種方案所用的天數更少。 評測用例規模與約定 對于20%的評測用例,1 ≤ n ≤ 10,1 ≤ m ≤ 20;
  對于40%的評測用例,1 ≤ n ≤ 100,1 ≤ m ≤ 1000;
  對于60%的評測用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 10000,1 ≤ c ≤ 1000;
  對于80%的評測用例,1 ≤ n ≤ 10000,1 ≤ m ≤ 100000;
  對于100%的評測用例,1 ≤ n ≤ 100000,1 ≤ m ≤ 200000,1 ≤ a, b ≤ n,1 ≤ c ≤ 1000000。

  所有評測用例保證在所有候選隧道都修通時1號樞紐可以通過隧道到達其他所有樞紐。
這道題有兩種求解方法。 一種是直接二分答案,取所有c值小于等于當前答案的邊來判聯通,如果所有c值小于等于當前答案的邊能夠聯通第1個點和第n個點,則當前解可行。二分找到最小的可行解。判聯通復雜度為O(n),總的時間復雜度為O(nlgc)。 另一種是直接貪心,按c值從小到大的順序不斷加邊,一直加到點1和點n聯通為止。用并查集實現復雜度為O(nlgn)。 下面是二分答案的代碼: 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int MAX=100005; 5 const int INF=1e9+7; 6 typedef long long ll; 7 8 int n,m; 9 struct Edge 10 { 11 int to,w; 12 Edge(int to,int w) 13 { 14 this->to=to; 15 this->w=w; 16 } 17 }; 18 19 vector<Edge> G[MAX]; 20 21 struct node 22 { 23 int id,step; 24 node(int id,int step) 25 { 26 this->id=id; 27 this->step=step; 28 } 29 }; 30 31 queue<node> q; 32 bool vis[MAX]; 33 bool BFS(int k) 34 { 35 while(!q.empty()) 36 q.pop(); 37 38 memset(vis,0,sizeof vis); 39 40 q.push(node(1,0)); 41 vis[1]=true; 42 while(!q.empty()) 43 { 44 node now=q.front(); 45 q.pop(); 46 47 int u=now.id; 48 if(u==n) 49 return now.step<=n; 50 51 for(int i=0;i<G[u].size();i++) 52 { 53 Edge e=G[u][i]; 54 55 if(vis[e.to]||e.w>k) 56 continue; 57 58 vis[e.to]=true; 59 60 q.push(node(e.to,now.step+1)); 61 } 62 } 63 return false; 64 } 65 66 int main() 67 { 68 while(~scanf("%d%d",&n,&m)) 69 { 70 int l=1,r=1; 71 for(int i=0;i<m;i++) 72 { 73 int a,b,c; 74 scanf("%d%d%d",&a,&b,&c); 75 r=max(r,c+1); 76 G[a].push_back(Edge(b,c)); 77 G[b].push_back(Edge(a,c)); 78 } 79 80 int ans=0; 81 82 while(l<=r) 83 { 84 int mid=(l+r)/2; 85 if(BFS(mid)) 86 { 87 ans=mid; 88 r=mid-1; 89 } 90 else 91 l=mid+1; 92 } 93 94 printf("%d\n",ans); 95 } 96 return 0; 97 }

?

轉載于:https://www.cnblogs.com/from00/p/6663632.html

總結

以上是生活随笔為你收集整理的201703-4 地铁修建的全部內容,希望文章能夠幫你解決所遇到的問題。

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