【问题描述】

已知含有n个顶点的带权连通无向图,采用邻接矩阵存储,邻接矩阵以三元组的形式给出,
只给出不包括主对角线元素在内的下三角形部分的元素,且不包括不相邻的顶点对。求该连通图的最小生成树中各边的权值之和。
注:三元组来表一条带权的边,如2 1 7表示顶点2到顶点1的边的权值为7.

【输入形式】

第一行给出结点个数n和三元组的个数count,以下每行给出一个三元组,数之间用空格隔开。
(注意这里顶点的序号是从1到n,而不是0到n-1,程序里要小心!)

【输出形式】

最小生成树的权值

【样例输入】

5 8
2 1 7
3 1 6
3 2 8
4 1 9
4 2 4
4 3 6
5 2 4
5 4 2

【样例输出】

18

【样例说明】

权值是正整数,可能很大,但不需要考虑整型溢出问题

C++代码

#include<iostream>
using namespace std;
struct edgenode {int begin, end, weight;   //定义边的两个邻接点、权重
};
int Find(int fathers[], int n) {   //找父亲函数int f = n;while (fathers[f] > 0)f = fathers[f];return f;
}
void CreateEdge(edgenode*& node) {node = new edgenode;cin >> node->begin >> node->end >> node->weight;   //录入两个临界点的序号及边权重
}
void Sort(edgenode* edgelist[], int e) {   //按边权值由小到大排序for (int i = 0; i < e; i++)for (int j = 0; j < e - i - 1; j++)if (edgelist[j]->weight > edgelist[j + 1]->weight)swap(edgelist[j], edgelist[j + 1]);
}
void Kruskal(edgenode* edgelist[], int e, int& cnt) {   //Kruskal算法int fathers[1000];for (int i = 0; i < e; i++)fathers[i] = 0;int bgf, edf;   //bgf=begin's father, edf=end's fatherfor (int i = 0; i < e; i++) {bgf = Find(fathers, edgelist[i]->begin);edf = Find(fathers, edgelist[i]->end);if (bgf != edf) {   //判断是否为一个连通分量fathers[edf] = bgf;   //若不为一个,则把两个连通分量归并为一个//cout << "(" << edgelist[i]->begin << "," << edgelist[i]->end << ")" << endl;cnt += edgelist[i]->weight;   //存放权值}}
}
int main() {edgenode* edgelist[1000];int n, e;   //n=nodes' count, e=edges' countcin >> n >> e;   //输入点、边数量for (int i = 0; i < e; i++)CreateEdge(edgelist[i]);   //初始化边表数组Sort(edgelist, e);   //排序int cnt = 0;   //存放权值Kruskal(edgelist, e, cnt);cout << cnt << endl;return 0;
}

用kruskal算法求最小生成树各边的权值之和相关推荐

  1. CSP认证201412-4 最优灌溉[C++题解]:最小生成树裸题、Kruskal算法求最小生成树

    题目分析 来源:acwing 分析:这是一道最小生成树的裸题. 这里默写Kruskal求最小生成树的最小费用的模板. 最小生成树模板请参考笔者的另一篇博文: 最小生成树板子-AcWing 859. K ...

  2. C语言实现克鲁斯卡尔Kruskal算法求最小生成树(附完整源码)

    Kruskal算法求最小生成树 Edge结构体,Graph结构体 Kruskal算法求最小生成树完整源码(定义,实现,main函数测试) Edge结构体,Graph结构体 // a structure ...

  3. Prim算法和Kruskal算法求最小生成树

    Prim算法 连通分量是指图的一个子图,子图中任意两个顶点之间都是可达的.最小生成树是连通图的一个连通分量,且所有边的权值和最小. 最小生成树中,一个顶点最多与两个顶点邻接:若连通图有n个顶点,则最小 ...

  4. prim算法求最小生成树_克鲁斯卡尔算法(Kruskal算法)求最小生成树

    上一节介绍了求最小生成树之普里姆算法.该算法从顶点的角度为出发点,时间复杂度为O(n2),更适合与解决边的绸密度更高的连通网.本节所介绍的克鲁斯卡尔算法,从边的角度求网的最小生成树,时间复杂度为O(e ...

  5. 图论 —— Kruskal 算法求最小生成树

    概述 Kruskal 算法是一种常见并且好写的最小生成树算法,由 Kruskal 发明.该算法的基本思想是从小到大加入边.算法实现基于贪心算法. 对于一个拥有 n n n 个顶点 m m m 条边的图 ...

  6. 最小生成树板子-AcWing 859. Kruskal算法求最小生成树

    题目分析 来源:acwing 分析: Kruskal算法思路: 将所有边按权重从小到大排序.算法瓶颈在此O(m×logm)O(m\times logm)O(m×logm) 枚举每条边:a和b是两个点, ...

  7. Kruskal算法求最小生成树

    思路 在原图中选择最小的边权,加其加入到生成树中,若此边在生成树中成环舍去. 代码实现 struct node { int a, b, w;bool operator<(node t){retu ...

  8. AcWing 859. Kruskal算法求最小生成树(稀疏图)

    题面连接 https://www.acwing.com/problem/content/861/ 思路 没啥好说的,就是贪心+破圈法,然后不断将最短的边加入集合中,可以参考我这篇博客 https:// ...

  9. Kruskal算法求解最小生成树

    最小生成树是一个连通图.什么是连通图,(强)连通图详解前面介绍了<图存储结构>,本节继续讲解什么是 连通图 . 前面讲过,图中从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是连 ...

最新文章

  1. 未来,所有的企业级SaaS应用都将依托于容器
  2. [搜索]波特词干(Porter Streamming)提取算法详解(1)
  3. C语言程序设计 | 打印一个n行的菱形
  4. Pytorch损失函数losses简介
  5. python 上下文管理器
  6. Angular5.0之 安装指定版本Angular CLI
  7. Mysql Oracle Tidb对空值的处理
  8. 08. 旋转数组的最小数字(C++版本)
  9. 关于云优CMS系统模板标签调用列表随机显示的代码rand()标签适用
  10. 三维重建笔记——Linux环境下openMVG的安装
  11. Ubuntu12.04 耳机无声 扬声器有声的解决
  12. win8专业版激活---遇到的问题
  13. Web前端是干嘛的 为什么要学Web前端
  14. 算法竞赛入门学习(篇一)
  15. 小程序输入框设置maxlength时,拼音也会被限制
  16. 阿里云函数计算使用教程
  17. 论文研读 —— 6. ImageNet Classification with Deep Convolutional Neural Networks (1/3)
  18. 《Python编程从入门到实践》学习笔记8:函数
  19. Raft源码分析 - 开始吧
  20. DevOps流水线实践教程|端到端研发效能提升

热门文章

  1. C#推流RTMP,摄像头、麦克风、桌面、声卡(附源码)
  2. 如何从零开始配置云主机
  3. tomcat依赖导入步骤_图说tomcat(三)导入tomcat源码到idea
  4. ege图形库-- 抓取屏幕,贴图,动画基础框架(三)
  5. 谷安天下结合owasp的培训
  6. 罗胖进入互联网富豪百强名单!
  7. 【实验课】一群人围一圈,隔一个杀一个,剩一个,最后活谁?
  8. 计算机二级word文字处理参考样式怎么看,计算机二级Msoffice-文字处理答案(解题步骤)资料...
  9. 会声会影X5编辑mts进行格式转换
  10. 4、做什么类型的产品经理