HDU 1233 还是畅通工程 [最小生成树]

来源:互联网 发布:仓管员用什么软件 编辑:程序博客网 时间:2024/06/18 06:33

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

35

Hint

Hint  Huge input, scanf is recommended.


题目大意:有n个点, 有(n*(n-1))/   2 条边, 求最小生成生树 , 就数据上而言还是prim快一些;不过我用的kruskal

AC代码:

<strong>#include <iostream>  #include <cstdio>  #include <algorithm> #include <cstring>#include <cmath>using namespace std ;struct node {int u , v , w ;}E[10000];int n , m , pre[10000] , sum ;int cmp (node a , node b ){return a.w < b.w ; }int find (int x ){if(pre[x]!=x) return pre[x] = find(pre[x]);return x ;}void add ( int i , int x , int y ){int dx = find(x) , dy = find(y);if(dx!=dy){pre[dy] = dx ;sum+=E[i].w;}}int kruskal(){for(int i = 1 ; i<=m ; i++){int dx = E[i].u , dy = E[i].v ;add(i,dx,dy);}return sum ; }int main(){while(cin>>n,n){sum = 0 ;for(int i = 1 ; i<=n ; i++) pre[i] = i ;m = (n*(n-1))/2;for(int i = 1 ; i<=m ; i++)  cin>>E[i].u>>E[i].v>>E[i].w;sort(E+1,E+1+m,cmp);cout<<kruskal()<<endl;}return 0 ;} </strong>

0 0
原创粉丝点击