题目:

思路:

有两种做法,一种是Prim算法,另外一种则是我所使用的Kruskal算法,Kruskal的算法实现可以参考:最小生成树-Prim算法和Kruskal算法,讲的已经是十分清楚了。

具体算法实现:

1.首先用结构体数组存储输入的边,并且初始化一个并查集思想中的父亲数组fa[i];

2.用sort根据边权进行排序,边权小的边在前,大的在后;

3.从1到m遍历已经排好序的边

(1)遍历到边i,其两个节点分别是a和b,查找两个节点的祖先A和B

(2)如果A == B,加入边i会形成环路,则跳过该边,continue。

(3)如果A != B,进行祖先之间的Union:执行 fa[A] = B 或者 fa[B] = A,之后进行计数器的自增以及最小生成树长度的记录。

4.当加入的边为n-1条时(通过计数器反映),结束循环。

其中非常需要注意的一点是,并查集的合并,指的是祖先之间的合并。

代码

//
// main.cpp
// Kruskal
//
// Created by wasdns on 16/12/22.
// Copyright © 2016年 wasdns. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; struct stedge
{
int u, v, len;
}; bool cmp(stedge s1, stedge s2)
{
return s1.len < s2.len;
} stedge seg[100000]; int fa[100005]; void Inifa(int n)
{
for (int i = 1; i <= n; i++)
{
fa[i] = i;
}
} int findfa(int x)
{
int f = x; while (f != fa[f])
{
f = fa[f];
} int i = x, j; while (i != f)
{
j = fa[i]; fa[i] = f; i = j;
} return f;
} int main()
{
int i, n, m; cin >> n >> m; Inifa(n); int u, v, w; for (i = 1; i <= m; i++)
{
cin >> u >> v >> w; seg[i].u = u;
seg[i].v = v;
seg[i].len = w;
} sort(seg+1, seg+m+1, cmp); int cnt = 0, lencnt = 0; for (i = 1; i <= m; i++)
{
int fa1 = findfa(seg[i].u);
int fa2 = findfa(seg[i].v); if (fa1 == fa2) continue; cnt++; lencnt += seg[i].len; fa[fa1] = fa2; //一定是祖先找祖先合并 if (cnt == n-1) break;
} cout << lencnt; return 0;
} /*
4
6
1 2 1
2 3 2
1 3 3
2 4 3
3 4 5
1 4 4
*/

2016/12/22

最新文章

  1. openresty 前端开发入门五之Mysql篇
  2. Swift学习笔记-ARC
  3. asp.net mvc 多级文件夹
  4. nvm诡异的报错
  5. CocoaPods的安装(图文并茂)OS X 10.11 系统
  6. UML——综合实例
  7. MVC中修改报错
  8. 在Linux CentOS 6.5 (Final)上安装git-1.9.0
  9. Objective-C官方文档翻译 Block
  10. Cesium 获取当前视图范围
  11. WebApi路由及版本控制
  12. Weblogic常见故障常:JDBC Connection Pools
  13. springmvc 前端 发ajax请求的几种方式
  14. 学生管理系统开发代码分析笔记:jsp+java bean+servlet技术
  15. podman(libpod)---github简单记录
  16. IIS短文件漏洞(搬运整理)
  17. 2.裴波那契(Fibonacci)数列
  18. Nodejs 中将html转换成pdf文件
  19. java中 Java.lang.Long.parseLong()方法
  20. 在golang中使用 cgo,如何让被嵌入的c语言代码调用golang

热门文章

  1. 转:delphi 删除指定文件夹下所有文件
  2. 九校联考 终&amp;启
  3. spark 部署问题
  4. Web标准中用于改善Web应用程序性能的各种方法总结
  5. CentOS 命令【备忘】
  6. BZOJ 1034 题解
  7. 20161007 NOIP 模拟赛 T1 解题报告
  8. 【BZOJ】2956: 模积和
  9. 【BZOJ1677】[Usaco2005 Jan]Sumsets 求和 递推
  10. Bug:播放页面自动跳到首页