POJ 1251 解题报告
2015-04-20 01:59
295 查看
这道题是最小生成树。代码和之前一样,只是输入格式差别。
thestoryofsnow | 1251 | Accepted | 184K | 0MS | C++ | 2217B |
/* ID: thestor1 LANG: C++ TASK: poj1251 */ #include <iostream> #include <fstream> #include <cmath> #include <cstdio> #include <cstring> #include <limits> #include <string> #include <vector> #include <list> #include <set> #include <map> #include <queue> #include <stack> #include <algorithm> #include <cassert> using namespace std; void makeset(const int N, std::vector<int> &parent, std::vector<int> &rank) { for (int u = 0; u < N; ++u) { parent[u] = u; rank[u] = 0; } } int find(int u, std::vector<int> &parent) { if (parent[u] != u) { parent[u] = find(parent[u], parent); } return parent[u]; } void union_set(int u, int v, std::vector<int> &parent, std::vector<int> &rank) { int ru = find(u, parent); int rv = find(v, parent); if (ru == rv) { return; } if (rank[ru] < rank[rv]) { parent[ru] = rv; } else if (rank[rv] < rank[ru]) { parent[rv] = ru; } else { parent[ru] = rv; rank[rv]++; } } class Edge { public: int u, v, w; Edge() {} Edge(int u, int v, int w) : u(u), v(v), w(w) {} bool operator< (const Edge &rhs) const { if (this->w != rhs.w) { return this->w < rhs.w; } return this->u < rhs.u || (this->u == rhs.u && this->v < rhs.v); } }; int kruskal(const int N, std::vector<Edge> &edges) { std::vector<int> parent(N); std::vector<int> rank(N); makeset(N, parent, rank); sort(edges.begin(), edges.end()); int mst = 0; for (int i = 0; i < edges.size(); ++i) { Edge edge = edges[i]; if (find(edge.u, parent) != find(edge.v, parent)) { mst += edge.w; union_set(edge.u, edge.v, parent, rank); } } return mst; } int main() { while (true) { int N; scanf("%d", &N); if (N == 0) { break; } std::vector<Edge> edges; for (int u = 0; u < N - 1; ++u) { char c; int n; scanf(" %c %d", &c, &n); assert (c == 'A' + u); for (int i = 0; i < n; ++i) { int w; scanf(" %c %d", &c, &w); assert(c > 'A' + u && c < 'A' + N); edges.push_back(Edge(u, c - 'A', w)); } } int mst = kruskal(N, edges); printf("%d\n", mst); } return 0; }
相关文章推荐
- poj 1251 Jungle Roads 解题报告(kruskal+prim)
- POJ1251解题报告
- POJ 1251 Jungle Roads 解题报告
- POJ-1308 & HDOJ-1325 Is It A Tree? 解题报告
- POJ 2942 Tarjan双联通分量+二分图 解题报告
- POJ 1001Exponentiation解题报告——求高精度幂
- POJ 2246 Matrix Chain Multiplication 解题报告(栈)
- POJ-1905 Expanding Rods 解题报告
- POJ-3349 Snowflake Snow Snowflakes 解题报告
- poj 1068 Parencodings/bnuoj 1187 Parencodings 解题报告
- POJ 1008(映射) 解题报告
- POJ 2853 解题报告
- poj 2001 解题报告
- 最小生成树,POJ和HDU几道题目的解题报告(基于自己写的模板)
- 2011.11.1 poj1789 Truck History 解题报告
- 【解题报告】 POJ 2318 TOYS -- 判断点在某个梯形内 叉积 + 二分
- POJ 2013 解题报告
- [解题报告]POJ2352 Stars 树状数组
- POJ-1068解题报告
- poj3299解题报告