170304 地鐵修建 ccf

參考node

Dijkstraios

https://blog.csdn.net/qq_36172505/article/details/82620831c++

最小生成樹ide

https://blog.csdn.net/qq_16234613/article/details/76795271spa

思路 .net

spfa:改變鬆弛條件,用spfa尋找最小的耗時3d

最小生成樹:Kruskal+並查集code

注意blog

這裏推薦使用最小生成樹的方法,代碼易編寫,空間複雜度與時間複雜度也更小,在模擬器中的平均運行時間更少。ci

實現

spfa

 1 #include<iostream>
 2 #include<vector>
 3 #include<queue>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 struct node{
 9     int v;
10     int t;
11 };
12 
13 const int MAXN=100005;
14 const int inf=1000005;
15 
16 vector<node> Map[MAXN];
17 int inque[MAXN];
18 int dis[MAXN];
19 queue<int> que;
20 
21 int spfa(int n){
22     
23     for(int i=1;i<=n;i++){
24         dis[i]=inf;
25         inque[i]=0;
26     }
27     
28     int tv;
29     tv=1;
30     que.push(tv);
31     inque[1]=1;
32     dis[1]=0;
33     
34     int v,t;
35     while(!que.empty()){
36         tv=que.front();
37         que.pop();
38         inque[tv]=0;
39 
40         for(int i=0;i<Map[tv].size();i++){
41             v=Map[tv][i].v;
42             t=Map[tv][i].t;
43             if(max(t,dis[tv])<dis[v]){
44                 dis[v]=max(t,dis[tv]);
45                 if(inque[v]==0){
46                     que.push(v);
47                     inque[v]=1;
48                 }
49             }
50         }        
51     }
52     return dis[n];
53 }
54 
55 int main(){    
56 
57     int n,m;
58     cin>>n>>m;
59     
60     int a,b,t;
61     node temp;
62     for(int i=0;i<m;i++){
63         cin>>a>>b>>t;
64         temp.v=b;
65         temp.t=t;
66         Map[a].push_back(temp);
67         temp.v=a;
68         Map[b].push_back(temp);
69     }
70     cout<<spfa(n);
71     
72     return 0;
73 }
View Code

最小生成樹

 1 #include<bits/stdc++.h>
 2 
 3 #define MAXN 100005
 4 #define MAXM 200005
 5 
 6 using namespace std;
 7 
 8 struct EDGE{
 9     int u;
10     int v;
11     int t;
12     bool operator <(const EDGE&a)const{
13         return t<a.t;
14     }
15 };
16 
17 EDGE edges[MAXM];
18 int flag[MAXN];
19 
20 int find(int i){
21     if(flag[i]==i){
22         return i;
23     }
24     else{
25         return flag[i]=find(flag[i]);
26     }
27 }
28 
29 int main(){
30     int n,m;
31     cin>>n>>m;
32     for(int i=0;i<m;i++){
33         cin>>edges[i].u>>edges[i].v>>edges[i].t;
34     }
35     for(int i=1;i<=n;i++){
36         flag[i]=i;
37     }
38     
39     sort(edges,edges+m);
40     
41     int x,y,w=0;
42     for(int i=0;i<m;i++){
43         x=find(edges[i].u);
44         y=find(edges[i].v);
45         w=edges[i].t;
46         if(x<y){
47             flag[y]=x;
48         }
49         else if(x>y){
50             flag[x]=y;
51         }
52         if(find(n)==1){
53             cout<<w;
54             break;
55         }
56     }
57     
58     return 0;
59 }
View Code

題目

問題描述
  A市有n個交通樞紐,其中1號和n號很是重要,爲了增強運輸能力,A市決定在1號到n號樞紐間修建一條地鐵。
  地鐵由不少段隧道組成,每段隧道鏈接兩個交通樞紐。通過勘探,有m段隧道做爲候選,兩個交通樞紐之間最多隻有一條候選的隧道,沒有隧道兩端鏈接着同一個交通樞紐。
  如今有n家隧道施工的公司,每段候選的隧道只能由一個公司施工,每家公司施工須要的天數一致。而每家公司最多隻能修建一條候選隧道。全部公司同時開始施工。
  做爲項目負責人,你得到了候選隧道的信息,如今你能夠按本身的想法選擇一部分隧道進行施工,請問修建整條地鐵最少須要多少天。
 
輸入格式
  輸入的第一行包含兩個整數 nm,用一個空格分隔,分別表示交通樞紐的數量和候選隧道的數量。
  第2行到第 m+1行,每行包含三個整數 abc,表示樞紐 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 ≤  ab ≤  n,1 ≤  c ≤ 1000000。   全部評測用例保證在全部候選隧道都修通時1號樞紐能夠經過隧道到達其餘全部樞紐。
相關文章
相關標籤/搜索