最小生成樹(改了兩個板子寫的)道路建設

題目: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。

示例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
示例2

輸入

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

相關文章
相關標籤/搜索