题目:

1212 无向图最小生成树
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。
Input
第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000)
第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)
Output
输出最小生成树的所有边的权值之和。
Input示例
9 14
1 2 4
2 3 8
3 4 7
4 5 9
5 6 10
6 7 2
7 8 1
8 9 7
2 8 11
3 9 2
7 9 6
3 6 4
4 6 14
1 8 8
Output示例
37

分析:

最小生成树 有两种主要算法, Kruskal 和 Prim、
Kruskal 算法
先把所有边按照权值排序, 依次选择, 把边连接的顶点加入集合,并且加上该边的权值。如果顶点已经在集合中, 择不做操作。
在Kruskal算法中, 集合的实现就用 并查集(不相交集 union-find )来实现。

Prim 算法 :
Kruskal算法是按照边来进行的, Prim 就是按照顶点来进行的。
从任意一个点出发, 把点计入树 T 中, 然后不断贪心选取 T 与其他顶点之间权值最小的边。 并加入 T 中, 就可以得到 MST 了;

实现:

Kruskal算法实现的。

#include <bits/stdc++.h>using namespace std;const int maxn = 1000 + 13;struct Edge {int from, to, dist;Edge(int _f, int _t, int _d):\from(_f), to(_t), dist(_d) {}bool operator < (const Edge a) const {return this->dist < a.dist;}
};struct Kruskal {int Pre[maxn], Rank[maxn];int n, m;vector<Edge> edges;void Init() {for(int i = 0; i <= this->n; ++i) Pre[i] = i, Rank[i] = 0;edges.clear();}/// UF 的实现int Find(int x) {if(Pre[x] == x) return x;else return Pre[x] = Find(Pre[x]);}bool Union(int x, int y) {int ax = Find(x), ay = Find(y);if(ax == ay) return false;if(Rank[ax] < Rank[ay])Pre[ax] = ay;else {Pre[ay] = ax;if(Rank[ay] == Rank[ax]) Rank[ax] ++;}return true;}/// Kruskal实现。int kruskal() {int ans = 0;sort(edges.begin(), edges.end());for(int i = 0; i < edges.size(); ++i) {int u = edges[i].from, v = edges[i].to;if(Union(u, v)) ans += edges[i].dist;}return ans;}void Add_Edges(int u, int v, int c) {edges.push_back(Edge(u,v,c));edges.push_back(Edge(v,u,c));}
};Kruskal Ks;int main()
{int u, v, c;while(cin >> Ks.n >> Ks.m) {Ks.Init();for(int i = 0; i < Ks.m; ++i) {cin >> u >> v >> c;Ks.Add_Edges(u, v, c);}cout << Ks.kruskal() <<endl;}
}

转载于:https://www.cnblogs.com/aoxuets/p/5506843.html

51nod--1212 最小生成树相关推荐

  1. 51NOD 1212 无向图最小生成树

    N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. 输入 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N <= 1000, 1 <= M ...

  2. 51Nod 1640 - 天气晴朗的魔法(最小生成树变形)

    题目链接 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 [题目描述] 这样阴沉的天气持续下去,我们不免担心起他的 ...

  3. 51nod 1213 二维曼哈顿距离最小生成树

    1213 二维曼哈顿距离最小生成树 基准时间限制:4 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 二维平面上有N个坐标为整数的点,点x1 y1同点x2 y2之间 ...

  4. 51nod 1213 二维曼哈顿距离最小生成树 树状数组+最小生成树

    Description 二维平面上有N个坐标为整数的点,点x1 y1同点x2 y2之间的距离为:横纵坐标的差的绝对值之和,即:Abs(x1 - x2) + Abs(y1 - y2)(也称曼哈顿距离). ...

  5. Prim最小生成树板子

    普里姆算法可以称为"加点法",每次迭代选择代价最小的边对应的点,加入到最小生成树中.算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点. 邻接矩阵存图  时间复杂度O(n^2 ...

  6. 51nod百度之星2016练习赛

    今天看了看51nod发现有这样一个练习赛,就做了做.因为实力太弱想不出E题,各位神犇勿D. (5.26UPD:E题想粗来了) A 区间交 不难发现若干线段[li,ri]的交就是[max(li),min ...

  7. 51nod-1640--天气晴朗的魔法(简单最小生成树)

    1640 天气晴朗的魔法 题目来源: 原创 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 这样阴沉的天气持续下去,我们不免担心起他的健康. 51nod魔法学校近日 ...

  8. 51nod1601-完全图的最小生成树计数【Trie,分治】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1601 题目大意 nnn个点的完全图,边(i,j)(i,j)(i,j)的权 ...

  9. 51nod1743-雪之国度【最小生成树,LCA,并查集】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1743 题目大意 nnn个点mmm条边的一张图,每次询问要求找出x,yx, ...

最新文章

  1. input属性为number,maxlength不起作用的解决方案
  2. 3----结构体中使用柔性数组
  3. 用Java读取xml文件内容
  4. Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出?
  5. 设计师必备导航类网站,内有宝藏!
  6. JS计算两个日期时间差,天 小时 分 秒格式
  7. 为什么mysql没有io多路复用_Redis凭啥可以这么快
  8. Julia : The Power Sum的算法
  9. structure 2.3.4 软件使用指南
  10. Uncode、ASCII、UTF-8之前的转换函数
  11. mysql数据库商户与买家_基于mysql实现离我最近的商家列表
  12. 获取头条小程序分享二维码
  13. 树莓派安装系统和系统备份还原
  14. python乒乓球比赛规则介绍_用英语介绍乒乓球的比赛规则
  15. mount.nfs: mount system call failed问题解决
  16. 「2019纪中集训Day23」解题报告
  17. 【源码篇】源码阅读集合
  18. Thread类的interrupt(),interrupted(),isInterrupted()
  19. 关于AckerMan函数
  20. python中(start, end,step ) 解释range()函数 和 切片操作

热门文章

  1. SQLAlchemy Tutorial
  2. python @cached_property
  3. go语言 gosched
  4. C语言 exit() _exit()
  5. CentOS7设置中文字符集
  6. c++并发操作mysql_文件数据库sqlite3 C++ 线程安全和并发
  7. 小牛485通讯原理_让你秒懂智能电表工作原理及抄表原理
  8. Java基础学习总结(167)——Java项目实践中如何实现幂等
  9. Mysql学习总结(59)——数据库分库分表策略总结
  10. Java基础学习总结(73)——Java最新面试题汇总