SDUT 2421 PowerOutage(最小生成树)
这个题简单描述一下,就是求最小生成树+最小生成树中源点的最大边,感觉有点贪心,不过还是挺明显的。题意很纠结啊,本来以为只是试着提交以下,居然1Y,看来前面几个题攒人品了。。感觉像是水过的。。。刚一查,是TC上的题。。。表示TC不会玩。。
这个题用prim特别好写,kur就应该麻烦了。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <math.h> 5 #define N 100000000 6 int p[101][101],o[101],low[101],hi[101]; 7 int main() 8 { 9 int i,j,k,n,m,sv,ev,w,max,sum,min; 10 while(scanf("%d",&m)!=EOF) 11 { 12 memset(o,0,sizeof(o)); 13 memset(low,0,sizeof(low)); 14 memset(hi,0,sizeof(hi)); 15 for(i = 0; i <= 100; i ++) 16 { 17 for(j = 0; j <= 100; j ++) 18 p[i][j] = N; 19 p[i][i] = 0; 20 } 21 n = 0; 22 for(i = 1; i <= m; i ++) 23 { 24 scanf("%d%d%d",&sv,&ev,&w); 25 if(p[sv][ev] > w) 26 { 27 p[sv][ev] = w; 28 p[ev][sv] = w; 29 } 30 if(n < sv) 31 n = sv; 32 if(n < ev) 33 n = ev; 34 } 35 for(i = 0; i <= n;i ++) 36 { 37 low[i] = p[0][i]; 38 if(low[i] != N) 39 hi[i] = low[i]; 40 } 41 o[0] = 1; 42 sum = 0; 43 for(;;) 44 { 45 min = N; 46 for(i = 0;i <= n;i ++) 47 { 48 if(!o[i]&&min > low[i]) 49 { 50 min = low[i]; 51 k = i; 52 } 53 } 54 if(min == N) 55 break; 56 sum += min; 57 o[k] = 1; 58 for(i = 0;i <= n;i ++) 59 { 60 if(low[i] > p[k][i]&&!o[i]) 61 { 62 hi[i] = p[k][i]+hi[k]; 63 low[i] = p[k][i]; 64 } 65 } 66 } 67 max = 0; 68 for(i = 1;i <= n;i ++) 69 { 70 if(max < hi[i]) 71 max = hi[i]; 72 } 73 printf("%d\n",2*sum - max); 74 } 75 return 0; 76 }