14年12月CCF真题4-最优灌溉
生活随笔
收集整理的這篇文章主要介紹了
14年12月CCF真题4-最优灌溉
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述
雷雷承包了很多片麥田,為了灌溉這些麥田,雷雷在第一個麥田挖了一口 很深的水井,所有的麥田都從這口井來引水灌溉。 為了灌溉,雷雷需要建立一些水渠,以連接水井和麥田,雷雷也可以利用 部分麥田作為“中轉站”,利用水渠連接不同的麥田,這樣只要一片麥田能被 灌溉,則與其連接的麥田也能被灌溉。現在雷雷知道哪些麥田之間可以建設水渠和建設每個水渠所需要的費用 (注意不是所有麥田之間都可以建立水渠)。請問灌溉所有麥田最少需要多少 費用來修建水渠。
輸入格式
輸入的第一行包含兩個正整數n, m,分別表示麥田的片數和雷雷可以建立 的水渠的數量。麥田使用1, 2, 3, ......依次標號。
接下來m行,每行包含三個整數ai, bi, ci,表示第ai片麥田與第bi片麥田之 間可以建立一條水渠,所需要的費用為ci。
輸出格式
輸出一行,包含一個整數,表示灌溉所有麥田所需要的最小費用。
輸入樣例
4 4
1 2 1
2 3 4
2 4 2
3 4 3
輸出樣例
6
樣例說明
建立以下三條水渠:麥田 1 與麥田 2、麥田 2 與麥田 4、麥田 4 與麥田 3。 評測用例規模與約定
前 20%的評測用例滿足:n≤5。
前 40%的評測用例滿足:n≤20。
前 60%的評測用例滿足:n≤100。 所有評測用例都滿足:1≤n≤1000,1≤m≤100,000,1≤ci≤10,000。?
?
對最小生成樹的考察,我用的prim算法。
?
#include <iostream> #include <vector> #include <math.h> #include <map>using namespace std;int main() {map<pair<int,int>,int> line; //儲存邊,key是相連兩田,value是費用map<int,int> net; //定義已連通的網int n,m;cin>>n>>m;for(int i=0;i<m;i++) //輸入數據 {int a,b,c;cin>>a>>b>>c;line.insert(pair<pair<int,int>,int>(pair<int,int>(a,b),c));}net[1]=0; //已連通網里添加田1int ans=0;while(net.size()<n){ //若已連通網里沒有全部田int min=10001; //定義最小值int field=1; //定義要添加的田for(map<pair<int,int>,int>::iterator it = line.begin();it!=line.end();it++){ //迭代搜尋與已添加的節點(田)連接的所具有最小的費用的點int a = it->first.first;int b = it->first.second;if((net.find(a)!=net.end() && net.find(b)==net.end()) //新點不應在net里的判斷|| (net.find(a)==net.end() && net.find(b)!=net.end())){int temp = it->second;if(temp<min) //更新最小值 {min=temp;if(net.find(a)==net.end())field=a;if(net.find(b)==net.end())field=b;}}}net[field]=0; //添加新點(田)ans+=min; //更新總費用 }cout<<ans;return 0; }?
轉載于:https://www.cnblogs.com/Outer-Haven/p/4695371.html
總結
以上是生活随笔為你收集整理的14年12月CCF真题4-最优灌溉的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: category、protocol、de
- 下一篇: yourtour的几种链接