QS Network ZOJ 1586 Prim

这个题绝对的Prim,但是这题有个怪一点的地方,他的适配器要重复买,比如顶点A和B连了一条边,顶点B和C连了一条边,那么要买,两个B适配器,一个A和一个C适配器,我先理解错了,以为只要买一个B适配器就可以了,所以连测试数据都过不了。然后可以直接把两个适配器的价格算在这条边的权值上,反正总的要求是造价最低嘛。。。

贴代码:

View Code
 1 #include <cstdio>
 2 #define MAXN 1020
 3 int n;
 4 int sum;
 5 int lowcost[MAXN];
 6 int edge[MAXN][MAXN];
 7 void Prim()
 8 {
 9     int i,j;
10     for(i=0; i<n; i++)
11         lowcost[i] = edge[0][i];
12     lowcost[0] = -1;
13     for(i=1; i<n; i++)
14     {
15         int min = 1000000;
16         int v;
17         for(j= 0; j<n; j++)
18         {
19             if(lowcost[j] != -1 && lowcost[j] < min)
20             {
21                 v = j;
22                 min = lowcost[j];
23             }
24         }
25         sum += min;
26         lowcost[v] = -1;
27         for(j=0; j<n; j++)
28         {
29             if(lowcost[j] != -1 && edge[v][j] <lowcost[j])
30                 lowcost[j] = edge[v][j];
31         }
32     }
33     printf("%d\n",sum);
34 }
35 int main()
36 {
37 //    freopen("in.cpp","r",stdin);
38     int t;
39     scanf("%d",&t);
40     while(t--)
41     {
42         int i,j;
43         scanf("%d",&n);
44         sum = 0;
45         int cost[MAXN];
46         for(i=0; i<n; i++)
47             scanf("%d",&cost[i]);
48         for(i=0; i<n; i++)
49             for(j=0; j<n; j++)
50             {
51                 scanf("%d",&edge[i][j]);
52                 edge[i][j] = edge[i][j] + cost[i]+cost[j];
53             }
54         Prim();
55     }
56     return 0;
57 }

 

posted on 2013-03-31 21:26  allh123  阅读(158)  评论(0编辑  收藏  举报

导航