您的位置:首页 > 其它

[HDOJ1301]Jungle Roads

2015-10-26 20:37 369 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301

最小生成树 (Kruskal)

#pragma warning(disable:4996)
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>

using namespace std;

typedef struct Node {
int a;
int b;
int v;
friend bool operator < (Node a, Node b) {
return a.v > b.v;
}
}Node;

const int maxn = 20010;
int pre[maxn];
int n, ans;
Node p;
priority_queue<Node> pq;

int find(int x) {
return x == pre[x] ? x : pre[x] = find(pre[x]);
}

bool unite(int x, int y) {
x = find(x);
y = find(y);
if (x != y) {
pre[y] = x;
return true;
}
return false;
}
inline void init() {
for (int i = 0; i < maxn; i++) {
pre[i] = i;
}
while (!pq.empty())    pq.pop();
}

int main() {
// freopen("in", "r", stdin);
while (~scanf("%d", &n) && n) {
init();
char a[2], b[2];
int cnt = 0;
int m, v;
ans = 0;
n--;
for (int i = 0; i < n; i++) {
scanf("%s %d", &a, &m);
for (int i = 0; i < m; i++) {
scanf("%s %d", &b, &v);
p.a = a[0] - 'A';
p.b = b[0] - 'A';
p.v = v;
pq.push(p);
}
}
while (n) {
p = pq.top();
pq.pop();
if (unite(p.a, p.b)) {
n--;
ans += p.v;
}
}
printf("%d\n", ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: