HDU 1233 还是畅通工程 ( Kruskal或Prim)

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 29411    Accepted Submission(s): 13156


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

 

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
Hint
Hint
Huge input, scanf is recommended.
 

 

Source
 

 

解题思路:

  直接裸裸的Kruskal 或者 Prim都能搞.

代码:

  用kruskal搞的

  1 # include<cstdio>

  2 # include<iostream>

  3 # include<fstream>

  4 # include<algorithm>

  5 # include<functional>

  6 # include<cstring>

  7 # include<string>

  8 # include<cstdlib>

  9 # include<iomanip>

 10 # include<numeric>

 11 # include<cctype>

 12 # include<cmath>

 13 # include<ctime>

 14 # include<queue>

 15 # include<stack>

 16 # include<list>

 17 # include<set>

 18 # include<map>

 19 

 20 using namespace std;

 21 

 22 const double PI=4.0*atan(1.0);

 23 

 24 typedef long long LL;

 25 typedef unsigned long long ULL;

 26 

 27 # define inf 999999999

 28 # define MAX 123

 29 

 30 int f[MAX];

 31 int n,m;

 32 int sum;

 33 

 34 struct edge

 35 {

 36     int u;

 37     int v;

 38     int w;

 39 }e[10004];

 40 

 41 int cmp ( const struct edge  & a,const struct  edge & b )

 42 {

 43     return a.w < b.w;

 44 }

 45 

 46 void input()

 47 {

 48     for ( int i = 1;i <= m;i++ )

 49     {

 50         int t1,t2,t3;

 51         scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].w);

 52     }

 53 }

 54 

 55 int getf( int v )

 56 {

 57     if ( v==f[v] )

 58     {

 59         return v;

 60     }

 61     else

 62     {

 63         f[v] = getf(f[v]);

 64         return f[v];

 65     }

 66 }

 67 

 68 int merge ( int v,int u )

 69 {

 70     int t1 = getf(v);

 71     int t2 = getf(u);

 72 

 73     if ( t1!=t2 )

 74     {

 75         f[t2] = t1;//t2的祖先是t1

 76         return 1;

 77     }

 78     return 0;

 79 }

 80 

 81 void Kruskal()

 82 {

 83     int cnt = 0;

 84     sort(e+1,e+m+1,cmp);

 85     for ( int i = 1;i <= m;i++ )

 86     {

 87         if ( merge( e[i].u,e[i].v ) )

 88         {

 89             cnt++;

 90             sum+=e[i].w;

 91         }

 92         if ( cnt==n-1)

 93             return;

 94     }

 95 }

 96 

 97 int main(void)

 98 {

 99     while ( scanf("%d",&n)!=EOF )

100     {

101         if ( n==0 )

102             break;

103         memset(e,0,sizeof(e));

104         sum = 0;

105         m = (n-1)*n/2;

106         input();

107 

108         for ( int i = 1;i <= n;i++ )

109         {

110             f[i] = i;

111         }

112         Kruskal();

113         printf("%d\n",sum);

114     }

115 

116     return 0;

117 }

 

 

代码:

用Prim搞的

你可能感兴趣的:(Prim)