還是暢通工程-最小生成樹
阿新 • • 發佈:2019-02-03
出了 pri bits 目標 == recommend NPU queue problem
原題鏈接:https://vjudge.net/problem/20289/origin
某省調查鄉村交通狀況,得到的統計表中列出了任意兩村莊間的距離。省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可),並要求鋪設的公路總長度為最小。請計算最小的公路總長度。
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
Hint
題解:
最小生成樹套模版就行,(這個我是學了算法後自己寫的,可能不是很簡練,歡迎斧正)
#include <bits/stdc++.h> #define inf 0x3f3f3f const int N=105; using namespace std; struct road{ int v,w; road(int _v,int _w):v(_v),w(_w){} }; int n; int mp[N]; vector<road> G[N]; int bfs(){ //queue<int> q; //q.push_back(1); vector<int> vr; memset(mp,0,sizeof(mp)); int ans=0; mp[1]=1; vr.push_back(1); while(vr.size()!=n){ int minn=inf; int id; for(int i=0;i<vr.size();i++){ //int u=q.top();q.pop(); for(auto x:G[vr[i]]){ if(mp[x.v]==0&&x.w<minn) minn=x.w,id=x.v; } } mp[id]=1; ans+=minn; //cout<<"minn="<<minn<<endl; //cout<<"ans="<<ans<<endl; vr.push_back(id); //cout<<"id="<<id<<endl; } return ans; } int main() { while(~scanf("%d",&n)&&n!=0){ memset(G,0,sizeof(G)); int tmp=n*(n-1)/2; while(tmp--){ int u,v,w; scanf("%d%d%d",&u,&v,&w); G[u].emplace_back(v,w); G[v].emplace_back(u,w); } //cout<<"uuu"<<endl; printf("%d\n",bfs()); } //cout << "Hello world!" << endl; return 0; }
還是暢通工程-最小生成樹