九度oj 1017

来源:互联网 发布:三星高通9008端口救砖 编辑:程序博客网 时间:2024/06/11 18:08
题目描述:
    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
输入:

    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
    当N为0时,输入结束,该用例不被处理。

输出:

    对每个测试用例,在1行里输出最小的公路总长度。

样例输入:
31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
样例输出:
35
来源:

2006年浙江大学计算机及软件工程研究生机试真题

#include<iostream>#include<string.h>#include<algorithm>using namespace std;#define N 101int tree[N];int findroot(int x){    if(tree[x]==-1)    return x;    else     return findroot(tree[x]);}struct edge{       int a,b;       int cost;       bool operator< (const edge &a)const       {            return cost<a.cost;            }            }edge[6000]; int main(){    int n;    while(cin>>n&&n!=0)    {                       for(int i=1;i<=n*(n-1)/2;i++)                       {                        cin>>edge[i].a>>edge[i].b>>edge[i].cost;                       }                       sort(edge+1,edge+1+n*(n-1)/2);                       for(int i=1;i<=n;i++)                       tree[i]=-1;                       int ans=0;                       for(int i=1;i<=n*(n-1)/2;i++)                       {                               int a=findroot(edge[i].a);                               int b=findroot(edge[i].b);                               if(a!=b)                               {                                       tree[a]=b;                                       ans+=edge[i].cost;                                       }                                       }                                       cout<<ans<<endl;                                       }                                       }                                  


0 0
原创粉丝点击