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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

201703-4 地铁修建

發(fā)布時(shí)間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 201703-4 地铁修建 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問(wèn)題描述

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

  所有評(píng)測(cè)用例保證在所有候選隧道都修通時(shí)1號(hào)樞紐可以通過(guò)隧道到達(dá)其他所有樞紐。
這道題有兩種求解方法。 一種是直接二分答案,取所有c值小于等于當(dāng)前答案的邊來(lái)判聯(lián)通,如果所有c值小于等于當(dāng)前答案的邊能夠聯(lián)通第1個(gè)點(diǎn)和第n個(gè)點(diǎn),則當(dāng)前解可行。二分找到最小的可行解。判聯(lián)通復(fù)雜度為O(n),總的時(shí)間復(fù)雜度為O(nlgc)。 另一種是直接貪心,按c值從小到大的順序不斷加邊,一直加到點(diǎn)1和點(diǎn)n聯(lián)通為止。用并查集實(shí)現(xiàn)復(fù)雜度為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 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/from00/p/6663632.html

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。