博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
克鲁斯卡尔
阅读量:5331 次
发布时间:2019-06-15

本文共 767 字,大约阅读时间需要 2 分钟。

最小生成树

首先来看看什么是最小生成树。

在一个无向连通图中,如果存在一个连通子图包含原图中所有的结点和部分边,且这个子图不存在回路(不成环),那么我们称这个子图为原图的一棵生成树。在带权图中,所有的生成树中边权的和最小的那棵(或几棵)被称为最小生成树。

 

注:图为无向图,红字表示边的权值,橙线表示不取的边。

最终:最小生成树=1→2的权值+1→3的权值+3→4的权值+3→5的权值=2+1+1+2=6

克鲁斯卡尔

克鲁斯卡尔是求最小生成树的算法之一,多用于稠密图。

进行以下步骤,直到取的边数等于点数减一。

 

(1)初始时所有结点属于孤立的集合。

 

(2)按照边权递增顺序遍历所有的边,若遍历到的边两个顶点仍分属不同的集合(该边即为联通这两个集合的边中权值最小的那条)则确定该边为最小生成树上的一条边,并将这两个顶点分属的集合合并。

 

(3)遍历完所有边后,原图上所有结点属于同一个集合则被选取的边和原图中所有结点构成最小生成树;否则原图不连通,最小生成树不存在。

上代码

#include
using namespace std; int n,parent[105]={-1};struct edge //表示一条有向边 { int b /*起点*/,e/*终点*/,v/*权值*/;}a[5005];void Initialize() //初始化,令每一个点的祖宗都为它自己。 { for(int i=0;i
>n; for(int i=0;i
>cost; if(i

  

 

转载于:https://www.cnblogs.com/zxjhaha/p/11192947.html

你可能感兴趣的文章
java web 各个文件夹命名原因
查看>>
Springboot使用alibaba的fastJson,@JSONField不起作用的问题
查看>>
数据库的基础语句-创建数据库、创建表、添加各种约束-扫盲一
查看>>
同一个IP不同端口号使用session失效
查看>>
迭代器模式 -- 大话设计模式
查看>>
数据库中插入记录
查看>>
Linux、Unix学习1
查看>>
java面试题之----String的intern
查看>>
C#读取配置和资源文件
查看>>
SVN源码服务器搭建
查看>>
5种Redis数据结构详解
查看>>
Java/Android开发规范——变量和常量命名
查看>>
Neutron:LBaaS v2
查看>>
Java MD5加密类
查看>>
获取用户地理位置
查看>>
javascript事件流的原理
查看>>
网页中屏蔽鼠标右键
查看>>
Java线程
查看>>
Http协议
查看>>
LeetCode -- Ugly Number
查看>>