poj1251 Jungle Roads
2017-12-15 21:04
621 查看
poj1251 Jungle Roads
标签:最小生成树题目链接
/* 题意:输出最小生成树的权值和。每组数据给出节点个数n,以下n-1行, 开头为起始节点,及与它相连的节点数目m,随后m组数据表示和它相连的节点以及边权值(用c++处理空格和换行符)。 思路:Kruskal。 */ #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; #define maxn 30 typedef struct{ int x, y; int w; }edge; edge e[maxn * maxn / 2]; int rank_[maxn], father[maxn], sum; int cmp(edge a, edge b){ // return a.w < b.w; } void make_set(int x){ father[x] = x; rank_[x] = 0; } int find_set(int x){ return x != father[x] ? find_set(father[x]) : father[x]; } void union_set(int x, int y, int w){ if(x == y) return ; if(rank_[x] > rank_[y]) father[y] = x; else{ if(rank_[x] == rank_[y]) rank_[y]++; father[x] = y; } sum += w; // } int main(){ int n, m, k, weight, i, j; char a, b; while(scanf("%d", &n) && n){ k = 0, sum = 0; for(i = 0; i < n - 1; i++){ cin >> a >> m, make_set(a - 'A'); for(j = 0; j < m; j++){ cin >> b >> weight, make_set(b - 'A'); e[k].x = a - 'A', e[k].y = b - 'A'; e[k++].w = weight; } } sort(e, e + k, cmp); for(i = 0; i < k; i++) union_set(find_set(e[i].x), find_set(e[i].y), e[i].w); printf("%d\n", sum); } return 0; }
相关文章推荐
- POJ 1251 Jungle Roads
- POJ 1251 Jungle Roads
- POJ 1251 Jungle Roads
- [POJ 1251]Jungle Roads Kruskal
- poj-1251 Jungle Roads *
- Jungle Roads POJ - 1251
- hdu 1301 Jungle Roads &&poj 1251 (prim 或者kruskal)
- [最小生成树] poj 1251 Jungle Roads
- 最小生成树- Jungle Roads POJ - 1251
- poj&nbsp;1251&nbsp;Jungle&nbsp;Roads&nbsp;最小生成树
- Jungle Roads POJ - 1251
- poj-1251 Jungle Roads
- POJ1251 Jungle Roads Kruskal+scanf输入小技巧
- POJ 1251 Jungle Roads
- poj 1251 Jungle Roads MST
- ZOJ1406 || POJ 1251 Jungle Road,就是道裸的MST。。。。
- hdu 1301 Jungle Roads poj
- poj 1251 Roads
- 1251 Jungle Roads
- 【POJ】Jungle Roads