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 } 

 

posted @ 2012-08-22 21:05  Naix_x  阅读(260)  评论(0编辑  收藏  举报