公路村村通 (30分)

来源:互联网 发布:python str datetime 编辑:程序博客网 时间:2024/04/27 13:20

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

输入格式:

输入数据包括城镇数目正整数NNN≤1000\le 10001000)和候选道路数目MMM≤3N\le 3N3N);随后的MMM行对应MMM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到NNN编号。

输出格式:

输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−1-11,表示需要建设更多公路。

输入样例:

6 151 2 51 3 31 4 71 5 41 6 22 3 42 4 62 5 22 6 63 4 63 5 13 6 14 5 104 6 85 6 3

输出样例:

12
#include<iostream>#include<vector>#include<cstdio>#include<algorithm>using namespace std;struct edge{int u,v,w;}e[10000];int f[30000];bool cmp(edge a,edge b){return a.w < b.w;}int getf(int v){if(f[v] == v) return v;else{f[v] = getf(f[v]);return f[v];}}bool merge(int x,int y){int m,n;m = getf(x);n = getf(y);if( m != n ){f[n] = m;return true;}return false;}void init(){for(int i = 1; i <=3000; i++) f[i] = i;}int main(){int n,m,sum = 0,count;cin>>n>>m;count = n;for(int i = 1; i <= m; i++)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);sort(e,e+m,cmp);init();for(int i =1; i <= m && count>1; i++){if(merge(e[i].u,e[i].v)){count--;sum = sum + e[i].w; }}if(count == 1) cout<<sum<<endl;    else cout<<"-1"<<endl;return 0;} 


1 0
原创粉丝点击