POJ 2485 Highways

题目来源:http://poj.org/problem?id=2485

      用贪心策略构成最小生成树,有常用的两种算法Prim算法和Kruskal算法。本题我采用的是Prim算法。

设带权图为V,首先随便选一点作为构成一个真子集S,然后在采取贪心策略,选取V-S中的某一点到S中

一点的最小距离并将该点添加进去,直到S=V。

 1 #include<stdio.h>
 2 const int maxn=500+5;
 3 int c[maxn][maxn],lowcost[maxn];
 4 bool s[maxn];
 5 int prime(int n)
 6 {
 7     s[1]=true;
 8     for(int i=2;i<=n;i++){
 9         lowcost[i]=c[1][i];
10         s[i]=false;
11     }
12     int j=1,maxlength=-1;
13     for(int i=1;i<n;i++){
14         int mincost=65537;
15         for(int k=2;k<=n;k++)
16             if(mincost>lowcost[k] && !s[k]){
17                 mincost=lowcost[k];
18                 j=k;
19             }
20         s[j]=true;
21         if(maxlength<mincost)
22             maxlength=mincost;
23         for(int k=2;k<=n;k++)
24             if(c[j][k]<lowcost[k] && !s[k])
25                 lowcost[k]=c[j][k];
26 
27     }
28     return maxlength;
29 }
30 int main()
31 {
32     int t;
33     scanf("%d",&t);
34     while(t--){
35         int n;
36         scanf("%d",&n);
37         for(int i=1;i<=n;i++)
38             for(int j=1;j<=n;j++)
39             scanf("%d",&c[i][j]);
40         int ans=prime(n);
41         printf("%d\n",ans);
42     }
43     return 0;
44 }

 

posted on 2014-07-31 14:53  BMESwimming  阅读(134)  评论(0编辑  收藏  举报