HDU 1233 还是畅通工程

来源:互联网 发布:美国艾绿床垫 知乎 编辑:程序博客网 时间:2024/06/06 03:29
还是畅通工程
Time Limit: 2000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u

Description

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 
 

Input

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

Output

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

Sample Input

31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50
 


Sample Output

3
5

Hint

Hint Huge input, scanf is recommended.
分析:最小生成树kruskal算法

#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>using namespace std;struct edge{    int u,v,cost;    bool operator < (const edge &w)const//将权值由小到大排序    {        return cost < w.cost;    }}a[5000];int n,m;int p[110];int find(int x)//并查集查找{    while(x != p[x])    {        x = p[x];    }    return x;}int kruskal(){    sort(a,a + m);//排序    for(int i = 1;i <= n;i++)//并查集初始化        p[i] = i;    int ans = 0;//结果初始化为0    for(int i = 0;i < m;i++)    {        int x = find(a[i].u);        int y = find(a[i].v);        if(x != y)//如果不在一个连通分量        {            ans += a[i].cost;//将权值加入结果中            p[x] = y;//合并连通分量        }    }    return ans;}int main(){    while(scanf("%d",&n))    {        if(n == 0)            break;        m = n * (n - 1) / 2;        for(int i = 0;i < m;i++)        {            scanf("%d %d %d",&a[i].u,&a[i].v,&a[i].cost);        }        printf("%d\n",kruskal());    }    return 0;}


0 0
原创粉丝点击