【HDU - 1863】 畅通工程(并查集+最小生成树)
生活随笔
收集整理的這篇文章主要介紹了
【HDU - 1863】 畅通工程(并查集+最小生成树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題干:
省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可)。經過調查評估,得到的統計表中列出了有可能建設公路的若干條道路的成本。現請你編寫程序,計算出全省暢通需要的最低成本。?
Input
測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 N、村莊數目M ( < 100 );隨后的 N?
行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本(也是正整數)。為簡單起見,村莊從1到M編號。當N為0時,全部輸入結束,相應的結果不要輸出。?
Output
對每個測試用例,在1行里輸出全省暢通需要的最低成本。若統計數據不足以保證暢通,則輸出“?”。?
Sample Input
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100Sample Output
3 ?解題報告:
? ? ? ? 依舊是暢通工程。不過這次不一樣了,不是裸并查集了,而是用并查集然后排序算最小生成樹。題目不難。涉及圖論連通圖的概念。
ac代碼:
#include<bits/stdc++.h>using namespace std; struct Node {int u,v;int w;bool operator< ( const Node & b) const{return w<b.w;} } node[105];int f[105]; int getf(int u) {return u==f[u] ? u : f[u]=getf(f[u]); } void merge(int u,int v) {int t1,t2;t1=getf(u);t2=getf(v);if(t1!=t2) f[t2]=t1; } int main() {int n,m;int cur,ans;while(scanf("%d %d",&n,&m) ) {if(n==0) break; for(int i = 1; i<=m; i++) f[i]=i;cur=0;ans=0;for(int i = 1; i<=n; i++) {scanf("%d %d %d",&node[i].u,&node[i].v,&node[i].w);}sort(node+1,node+n+1);for(int i = 1; i<=n; i++) {if(getf(node[i].u) != getf(node[i].v ) ) {merge(node[i].u,node[i].v);cur++;ans+=node[i].w;if(cur==m-1) break;}}if(cur==m-1) printf("%d\n",ans);else printf("?\n");}return 0 ;}總結:
? ? ?暫無。
?
總結
以上是生活随笔為你收集整理的【HDU - 1863】 畅通工程(并查集+最小生成树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 央行、中国人民银行和中国银行有什么区别?
- 下一篇: 工行办大额信用卡 大额信用卡申卡技巧大全