【HDU1879】继续畅通工程(MST基础题)

真心大水题。。。不多说。

 

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <cctype>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <numeric>
 9 
10 #define typec int
11 using namespace std;
12 
13 const typec inf = 0xffff;
14 const int V = 105;
15 int vis[V];
16 typec lowc[V], Map[V][V];
17 
18 typec prim (typec cost[][V], int n) {
19     int i, j, p;
20     typec minc, res = 0;
21     memset(vis, 0, sizeof(vis));
22     vis[0] = 1;
23     for (i = 1; i < n; ++ i) lowc[i] = cost[0][i];
24     for (i = 1; i < n; ++ i) {
25         minc = inf;
26         p = -1;
27         for (j = 0 ; j < n; ++ j) {
28             if (0 == vis[j] && minc > lowc[j]) {
29                 minc = lowc[j];
30                 p = j;
31             }
32         }
33         if (inf == minc) return -1;
34         res += minc;
35         vis[p] = 1;
36         for (j = 0 ; j < n; ++ j) {
37             if (0 == vis[j] && lowc[j] > cost[p][j]) {
38                 lowc[j] = cost[p][j];
39             }
40         }
41     }
42     return res;
43 }
44 
45 int main () {
46     int n;
47     while (~scanf("%d", &n)) {
48         if (!n) break;
49         for (int i = 0 ; i < V; ++i) {
50             for (int j = 0; j < V; ++ j) {
51                 if (i == j) Map[i][j] = 0;
52                 else Map[i][j] = inf;
53             }
54         }
55 
56         for (int i = 0 ; i < n * (n - 1) / 2; ++i) {
57             int x, y, w, ok;
58             scanf("%d%d%d%d", &x, &y, &w, &ok);
59             if (!ok) {
60                 Map[x - 1][y - 1] = Map[y - 1][x - 1] = min(Map[x][y], w);
61             } else {
62                 Map[x - 1][y - 1] = Map[y - 1][x - 1] = 0;
63             }
64         }
65 
66         cout << prim(Map, n) << endl;
67     }
68     return 0;
69 }
posted @ 2014-07-24 14:27  Desgard_Duan  阅读(148)  评论(0编辑  收藏  举报