還是暢通工程(最小生成樹入門基礎題)
阿新 • • 發佈:2018-12-20
某省調查鄉村交通狀況,得到的統計表中列出了任意兩村莊間的距離。省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可),並要求鋪設的公路總長度為最小。請計算最小的公路總長度。
Input測試輸入包含若干測試用例。每個測試用例的第1行給出村莊數目N ( < 100 );隨後的N(N-1)/2行對應村莊間的距離,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間的距離。為簡單起見,村莊從1到N編號。 當N為0時,輸入結束,該用例不被處理。 Output對每個測試用例,在1行裡輸出最小的公路總長度。 Sample Input
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
Sample Output
3 5 Huge input, scanf is recommended.
Hint
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; struct node { int x, y, val; }road[100005]; int pre[200]; int Find(int x) { if(x==pre[x]) { return x; } else { return pre[x]=Find(pre[x]); } } bool merge(int x,int y) { int fx=Find(x); int fy=Find(y); if(fx!=fy) { pre[fx]=fy; return true; } else { return false; } } bool cmp(node x,node y) { return x.val<y.val; } int main() { int n,m; while(scanf("%d",&n)&&n) { m=n*(n-1)/2; for(int t=1;t<=m;t++) { scanf("%d%d%d",&road[t].x,&road[t].y,&road[t].val); } sort(road+1,road+m+1,cmp); for(int t=1;t<=n;t++) { pre[t]=t; } int cnt=0; long long int sum=0; for(int t=1;t<=m;t++) { if(merge(road[t].x,road[t].y)) { cnt++; sum+=road[t].val; if(cnt==n-1) break; } } printf("%lld\n",sum); } return 0; }