題目:ios
https://www.nowcoder.com/acm/contest/76/B測試
連接:https://www.nowcoder.com/acm/contest/76/B
來源:牛客網
spa
隨着現在社會的不斷變化,交通問題也變得愈來愈重要,因此市長決定建設一些公路來方便各個城市之間的貿易和交易。雖然市長的想法很好,可是他也遇到了通常人也常常頭疼的問題,那就是手頭的經費有限……在規劃過程當中,設計師們已經預算出部分城市之間建設公路的經費需求。如今市長想知道,它能不能將他的m個城市在有限的經費內實現公路交通。若是能夠的話,輸出Yes,不然輸出No(兩個城市不必定要直接的公路相連,間接公路到達也能夠。) 設計
測試輸入包含多條測試數據
每一個測試數據的第1行分別給出可用的經費c(<1000000),道路數目n(n<10000),以及城市數目m(<100)。
接下來的n行給出創建公路的成本信息,每行給出三個整數,分別是相連的兩個城市v一、v2(0<v1,v2<=m)以及建設公路所需的成本h(h<100)。
對每一個測試用例,輸出Yes或No。
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
10 2 2 1 2 5 1 2 15
Yes
兩個城市之間可能存在多條線路
題意: 將全部的城市鏈接起來求最小的花費是否小於總價c
思路:
最小生成樹問題:求出最小的花費就okcode
ps: 若是不能把全部的城市鏈接起來就算noblog
代碼:遞歸
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<set> #include<algorithm> #include<map> #define maxn 50010 using namespace std; int par[maxn]; int ranke[maxn]; void init(int n) { for(int i=0;i<n;i++){ par[i]=i; ranke[i]=0; } } int find(int x)//找父親 { if(par[x]==x)return x; else { return par[x]=find(par[x]);//遞歸找父親(由於父親是統一的) } } void unite(int x,int y) { x=find(x); y=find(y); if(x==y)return ; if(ranke[x]<ranke[y]) { par[x]=y; } else par[y]=x; if(ranke[x]==ranke[y])ranke[x]++; } bool same(int x,int y) { return find(x)==find(y); } struct edge{ int from,to,cost; }; bool comp(const edge& e1,const edge& e2) { return e1.cost<e2.cost; } edge mp[maxn]; int V,E; int res; int flag; int kruskal() { flag=1; sort(mp,mp+E,comp); init(V); res=0; for(int i=0;i<E;i++) { edge s=mp[i]; if(!same(s.from,s.to)){ unite(s.from,s.to); flag++; res+=s.cost; } } return res; } int main() { int d1,d2,dis; int mon; while(cin>>mon>>E>>V) { for(int i=0;i<E;i++) { cin>>d1>>d2>>dis; d1--; d2--; mp[i].from=d1; mp[i].to=d2; mp[i].cost=dis; } kruskal(); //cout<<flag; if(flag!=V)cout<<"No"<<endl; else { if(res>mon)cout<<"No"<<endl; else cout<<"Yes"<<endl; } } return 0
題目很簡單,原本早就能夠出的,可是因爲題目理解錯誤還有沒有考慮 ps 的那種狀況使這題晚了半小時出,,怎麼說呢,原本學了這麼久的圖論樹論這場能夠打個很好的成績的,仍是須要努力啊,畢竟這個實力太弱了了,圖論的題目仍是要多刷,多藏些板子。ci
還有一個學期,加油吧get