[HDOJ1301]Jungle Roads
2015-10-26 20:37
369 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301
最小生成树 (Kruskal)
最小生成树 (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); } }
相关文章推荐
- 闭上眼一如既往保持一颗安然又坚定的心!
- openfire源码分析---3
- iOS--sqlite--增删改查
- 《Java 2 实用教程》读书笔记(一)
- C++:派生类的构造函数和析构函数
- java.util.concurrent.locks.LockSupport (讲得比较细)
- virtualbox cannot access the kernel driver的解决办法
- 设计模式之单例模式--java
- Dorado创建HelloWorld项目
- 程序员永远的鸡血 - 编程语言“银弹”之争
- Oracle基础概述
- Yii2的深入学习--继承关系
- 查询和网页间值得传递 遍历及展示 数据的插入 数据库的更新
- Linux-CentOS 安装XPDF
- 编写算法代码
- 【C语言】【笔试题】实现函数itoa(int n,char s[]),将整数n这个数字转换为对应的字符串,保存到s中
- 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest, B. Layer Cake
- 整数划分解题报告(DP方法)
- 缩影版供应链管理系统项目 正在开发中......
- FPGA仿真设置步骤