poj1251 Jungle Roads Kruskal算法+并查集
| 時限:?1000MS | ? | 內存限制:?10000K |
| 提交總數:?37001 | ? | 接受:?17398 |
描述
熱帶島嶼拉格里山的首長有個問題。幾年前,大量的外援花在了村莊之間的額外道路上。但是叢林不斷地超越道路,因此龐大的道路網太昂貴而無法維護。老年人理事會必須選擇停止維護一些道路。左上方的地圖顯示了目前正在使用的所有道路,以及每月維護這些道路的費用。當然,即使路線不像以前那么短,也需要采取某種方式在所有村莊之間保持通行。長老院長想告訴長老委員會每月要花多少錢才能維持連接所有村莊的道路。在上面的地圖中,這些村莊被標記為A到I。右邊的地圖顯示了可以最便宜地維護的道路,每月可節省216英畝。您的任務是編寫一個解決此類問題的程序。
輸入
輸入由1到100個數據集組成,后面是僅包含0的最后一行。每個數據集都從僅包含數字n的行開始,n是村莊的數目,1 <n <27,并標記了村莊字母的前n個字母大寫。每個數據集都以n-1行完成,這些行以字母順序的村莊標簽開頭。最后一個村莊沒有電話。村莊的每條線均以村莊標簽開頭,后跟從該村莊到帶有字母標簽的村莊的道路的數量k。如果k大于0,則該行以k條道路中的每條道路的數據繼續。每條道路的數據是道路另一端的村莊標簽,其后是道路的每月維護成本(以acms為單位)。維護成本將為小于100的正整數。該行中的所有數據字段均由單個空格分隔。公路網將始終允許所有村莊之間的旅行。該網絡永遠不會超過75條道路。到其他村莊的村莊中,沒有一條道路會超過15條(在字母表中的前后)。在下面的示例輸入中,第一個數據集與上面的地圖一起顯示。
產量
每個數據集的輸出為每行一個整數:維護連接所有村莊的道路系統的每月最低費用(以aacms計)。警告:檢查每條可能的道路的暴力解決方案都不會在一分鐘的時間內完成。
樣本輸入
9 A 2 B 12 I 25 B 3 C 10 H 40 I 8 C 2 D 18 G 55 D 1 E 44 E 2 F 60 G 38 F 0 G 1 H 35 H 1 I 35 3 A 2 B 10 C 40 B 1 C 20 0樣本輸出
216 30資源
裸題,看不懂的話多看看圖即可!
#include<iostream> #include<queue> #include<algorithm> #include<set> #include<cmath> #include<cstdio> //---------------------------------Sexy operation--------------------------//#define cini(n) scanf("%d",&n) #define dis(a,b,c,d) ((double)sqrt((a-c)*(a-c)+(b-d)*(b-d))) using namespace std; //___________________________Dividing Line__________________________________/# #define N 105 using namespace std;int father[28]; int rank[28]; int sum; struct edge {int st;int ed;int w;bool operator< (const edge x)const{return w<x.w;} } e[400]; int top = 0; int find(int x) {if(x != father[x])father[x] = find(father[x]);return father[x]; } void addEdge(int x, int y, int z) {e[top].st = x;e[top].ed = y;e[top].w = z;top++; } int main() {int n,cnt,ans;char a,c;int edgeNum;int weight1;while(~scanf("%d",&n)&&n){top =cnt=ans=0;for(int i = 0; i < n -1 ; i++){cin>>a;cin>>edgeNum;for(int j = 0; j < edgeNum; j++){cin>>c;cin>>weight1;int k = int(c - 'A');addEdge(i, k, weight1);}}for(int i = 0; i <= n; i++){father[i] = i;}//cout<<1<<endl;sort(e,e+top);for(int i=1;i<=n;i++) father[i]=i;//cout<<1<<endl;for(int i=0;i<top;i++){int xx=find(e[i].st),yy=find(e[i].ed);if(xx!=yy){cnt++;ans+=e[i].w;father[yy]=xx;if(cnt==n-1) break;}}cout<<ans<<endl;}return 0; }總結
以上是生活随笔為你收集整理的poj1251 Jungle Roads Kruskal算法+并查集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: alibaba pc safe serv
- 下一篇: POJ2421 Constructing