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 }