[HDOJ1301]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301

最小生成树 (Kruskal)

 1 #pragma warning(disable:4996)
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <iomanip>
 5 #include <cstring>
 6 #include <climits>
 7 #include <complex>
 8 #include <fstream>
 9 #include <cassert>
10 #include <cstdio>
11 #include <bitset>
12 #include <vector>
13 #include <deque>
14 #include <queue>
15 #include <stack>
16 #include <ctime>
17 #include <set>
18 #include <map>
19 #include <cmath>
20
21 using namespace std;
22
23 typedef struct Node {
24     int a;
25     int b;
26     int v;
27     friend bool operator < (Node a, Node b) {
28         return a.v > b.v;
29     }
30 }Node;
31
32 const int maxn = 20010;
33 int pre[maxn];
34 int n, ans;
35 Node p;
36 priority_queue<Node> pq;
37
38 int find(int x) {
39     return x == pre[x] ? x : pre[x] = find(pre[x]);
40 }
41
42 bool unite(int x, int y) {
43     x = find(x);
44     y = find(y);
45     if (x != y) {
46         pre[y] = x;
47         return true;
48     }
49     return false;
50 }
51 inline void init() {
52     for (int i = 0; i < maxn; i++) {
53         pre[i] = i;
54     }
55     while (!pq.empty())    pq.pop();
56 }
57
58 int main() {
59     // freopen("in", "r", stdin);
60     while (~scanf("%d", &n) && n) {
61         init();
62         char a[2], b[2];
63         int cnt = 0;
64         int m, v;
65         ans = 0;
66         n--;
67         for (int i = 0; i < n; i++) {
68             scanf("%s %d", &a, &m);
69             for (int i = 0; i < m; i++) {
70                 scanf("%s %d", &b, &v);
71                 p.a = a[0] - ‘A‘;
72                 p.b = b[0] - ‘A‘;
73                 p.v = v;
74                 pq.push(p);
75             }
76         }
77         while (n) {
78             p = pq.top();
79             pq.pop();
80             if (unite(p.a, p.b)) {
81                 n--;
82                 ans += p.v;
83             }
84         }
85         printf("%d\n", ans);
86     }
87 }
时间: 2024-10-08 07:03:13

[HDOJ1301]的相关文章

hdoj-1301 Jungle Roads 【最小生成树】

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1301 题目可长 而且还是英文  没必要一字一句的去读题  可以根据下面的输入输出和图来搞清题意 题意:有n个村庄,村庄间有公路,公路保护费用太高,不得已维护某些公路,但必须保证每个村庄间畅通.问最少要维护的道路长度 这一题主要将表示村庄的字符转化为数字,存入表示两村庄间关系的结构体中即可. #include<cstdio> #include<cstring> #include<alg

HDOJ 1301 Jungle Roads

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301 //HDOJ1301 #include<iostream>#include<cstring> using namespace std; #define MAX 99999 #define LEN 30 int dist[LEN];//某点的权值 起始点到目标点的权值 int map[LEN][LEN];//某点到某点两点之间的权值 bool isvisitd[LEN];//表示某