nowcoder 道路建設

ACM_e發表於2018-02-24
連結:https://www.nowcoder.com/acm/contest/76/B
來源:牛客網


題目描述 
隨著如今社會的不斷變化,交通問題也變得越來越重要,所以市長決定建設一些公路來方便各個城市之間的貿易和交易。雖然市長的想法很好,但是他也遇到了一般人也經常頭疼的問題,那就是手頭的經費有限……在規劃過程中,設計師們已經預算出部分城市之間建設公路的經費需求。現在市長想知道,它能不能將他的m個城市在有限的經費內實現公路交通。如果可以的話,輸出Yes,否則輸出No(兩個城市不一定要直接的公路相連,間接公路到達也可以。)


輸入描述:
測試輸入包含多條測試資料
每個測試資料的第1行分別給出可用的經費c(<1000000),道路數目n(n<10000),以及城市數目m(<100)。
接下來的n行給出建立公路的成本資訊,每行給出三個整數,分別是相連的兩個城市v1、v2(0<v1,v2<=m)以及建設公路所需的成本h(h<100)。
輸出描述:
對每個測試用例,輸出Yes或No。
示例1
輸入
20 10 5
1 2 6
1 3 3
1 4 4
1 5 5
2 3 7
2 4 7
2 5 8
3 4 6
3 5 9
4 5 2
輸出

Yes


#include<bits/stdc++.h>
using namespace std;
#define maxn 100000
int fa[maxn];
struct ac{
   int x,y,z;
   ac(){}
   ac(int a,int b,int c){
      x=a,y=b,z=c;
   }
   bool operator <(const ac &a) const{
       return z<a.z;
   }
}a[maxn];
int fin(int x){
  return fa[x]==x? x:fa[x]=fin(fa[x]);
}
int main(){
   int c,n,m;
   while(cin>>c>>n>>m){
     for(int j=0;j<n;j++){
        scanf("%d%d%d",&a[j].x,&a[j].y,&a[j].z);
     }
     for(int j=0;j<=m;j++){
       fa[j]=j;
     }
     sort(a,a+n);
     long long ans=0;
     int k=0;
     for(int j=0;j<n;j++){
        int u=fin(a[j].x);
        int v=fin(a[j].y);
        if(u!=v){
           fa[v]=u;
           ans+=a[j].z;
           k++;
        }
        if(k==m-1) break;
     }
     if(ans<=c){
        cout<<"Yes"<<endl;
     }
     else{
        cout<<"No"<<endl;
     }
   }
}



相關文章