kruskalCase克鲁斯卡尔算法

article/2025/11/5 23:40:02

介绍

它的特点和Prim算法不一样,Prim是以点为主,通过顶点遍历没有访问的节点计算最小权重直至一条最小边出来;而Kruskal算法是以边为主,时间复杂度要低一些0(edge);

什么是最小生成树

  • 最小生成树:在一个有n个结点的无向图中选出最少的边,保证所选边权相加之和最小以及该图中依然有n个结点并且n个结点连通。
  • 一共有n个结点,要保证连通,至少需要n-1条边。
  • 最小生成树的权值:w ( t ) = ∑ ( u , v ) ∈ t w ( u , v ) w(t)=\sum\limits_{(u,v)\in t}^{}w(u,v)w(t)= (u,v)∈t∑w(u,v)
    下面我们用图看一下什么是最小生成树:

请添加图片描述
在该图中,我们留下这四条边就可以保证各个结点是连通的了,同时也保证所有边权之和最小,所以这个图的最小生成树权值为:1 + 2 + 3 + 5 = 11 1+2+3+5=111+2+3+5=11
请添加图片描述

Kruskal思路:

  1. 首先按照边权从小到大排序
  2. 然后从小到大看每条边,判断两个节点的顶点是否是同一个,需要判断是否会回路

例子:
3. 开始克鲁斯卡尔算法来找到第一条边
请添加图片描述
4. 找到第二条边
请添加图片描述

  1. 找到第三条边

请添加图片描述
6. 最关键的第四条边
当你找到第四条边的时候会发现第四条边的两边所依附的节点已经是连通的了,根据克鲁斯卡尔算法需要将构成回路的边给去掉,因为你要计算最小生成树,既然这两个点已经连通了,那我们肯定是可以不选这条边的,不选这条边必然不会让结果变得更差,所以我们直接跳过这条边
请添加图片描述
7. 计算第五条边
找到第五条边,找完五条边可以发现此时此刻所有的点已经连通了,最小生成树已经找到!
最小生成树的权值:1 + 2 + 3 + 5 = 11
请添加图片描述

代码实现

在这里插入图片描述

1.构造方法
在构造的时候我们会进行遍历矩阵判断节点是否有INF,如果都是有自己值的话就进行判断edgeNum++

 //1.构造克鲁斯卡尔的构造public KruskalCase(char[] vertexs, int[][] matrix) {/*** 1.初始化顶点数和边的个数*/int vlen = vertexs.length;/*** 2.利用复制拷贝将传入的数组拷贝一份*/this.vertexs = new char[vlen];for (int i = 0; i < vertexs.length; i++) {this.vertexs[i] = vertexs[i];}/*** 3.初始化边,使用的也是复制拷贝*/this.matrix = new int[vlen][vlen];for (int i = 0; i < vlen; i++) {for (int j = 0; j < vlen; j++) {this.matrix[i][j] = matrix[i][j];}}/*** 4.统计边的条数*/for (int i = 0; i < vlen; i++) {for (int j = i + 1; j < vlen; j++) {//4.1判断边是否有效(用INF来判断)if (this.matrix[i][j] != INF) edgeNum++;}}}
public static void main(String[] args) {char[] vertexs = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};int[][] matrix = {{0, 12, INF, INF, INF, 16, 14},{12, 0, 10, INF, INF, 7, INF},{INF, 10, 0, 3, 5, 6, INF},{INF, INF, 3, 0, 4, INF, INF},{INF, INF, 5, 4, 0, 2, 8},{16, 7, 6, INF, 2, 0, 9},{14, INF, INF, INF, 8, 9, 0}};KruskalCase kruskalCase = new KruskalCase(vertexs, matrix);}

2.将构造好的图打印出来

//2.打印邻接矩阵public void print() {System.out.println("邻接矩阵: \n");for (int i = 0; i < vertexs.length; i++) {for (int j = 0; j < vertexs.length; j++) {System.out.printf("%12d\t", matrix[i][j]);}System.out.println();}}

3.关键:将构造好的边进行排序处理

/*** 代表一条边*/
class EData {char start; //边的一个点char end; //边的另外一个点int weight; //边的权值public EData(char start, char end, int weight) {this.start = start;this.end = end;this.weight = weight;}//输出边的信息@Overridepublic String toString() {return "Edata [start=" + start + ", end=" + end + ", weight=" + weight + "]";}}
/*** 3.对边进行排序处理(冒泡排序)** @param edges:边的集合*/private void sortEdges(EData[] edges) {for (int i = 0; i < edges.length - 1; i++) {for (int j = 0; j < edges.length - 1 - i; j++) {if (edges[j].weight > edges[j + 1].weight) {//进行交换EData tmp = edges[j];edges[j] = edges[j + 1];edges[j + 1] = tmp;}}}}

4.寻找目标节点ch在数据数组中的下标位置

/*** 4.寻找对应的值的下标位置** @param ch 顶点的值,比如'A','B'* @return 返回ch顶点对应的下标,如果找不到就返回-1*/private int getPosition(char ch) {for (int i = 0; i < vertexs.length; i++) {if (vertexs[i] == ch) {return i;}}return -1;}

5.获取所有的边

/*** 5.获取图钟的边,将其放到EData[]数组当中* 通过邻接矩阵matrix获取** @return*/private EData[] getEdges() {int index = 0;//1.存储有效边的数组EData[] edges = new EData[edgeNum];for (int i = 0; i < vertexs.length; i++) {for (int j = i + 1; j < vertexs.length; j++) {//2.判断是否是有效边if (matrix[i][j] != INF) {edges[index++] = new EData(vertexs[i], vertexs[j], matrix[i][j]);}}}return edges;}

在这里插入图片描述

7.获取下标i的顶点的终点——>在后面判断是否回路起到关键作用
思路:从ends数组中得到i的终点,并赋值给i返回的值为终点(一个变量i即可,减少了内存的消耗)

 /*** 6.功能:获取下标为 i 的顶点的终点,用于后面判断两个顶点的终点是否相同* 在已经生成边的时候才会进入while中,否则就是0* @param ends:记录了各个顶点对应的终点是哪个,ends是在遍历过程中,逐步形成的* @param i:表示传入顶点对应的下标* @return:返回的是下标为i的这个顶点对应的终点的下标*/public int getEnd(int[] ends, int i) {//如果为0说明终点就是自己,ends装的是对应顶点i的终点while (ends[i] != 0) {i = ends[i];}return i;}

8.Kruskal算法的使用
1.首先得到所有的边
2.然后进行排序
3.遍历所有的边,判断是否构成回路,如果没有就加入到结果集中
得到中每条边的起点p1和终点p2,获取两个点的顶点判断是否构成回路,如果没有的话就将p1的终点的终点设置为p2的终点,并加入到结果集中

public void kruskal() {int index = 0; //表示最后结果的索引int[] ends = new int[edgeNum]; //用于保存“已有最小生成树中的每个顶点在最小生成树的终点"EData[] rets=new EData[edgeNum]; //保留结果,最后的最小生成树//1.获取图中所有边的集合,一共12条边EData[] edges = getEdges();System.out.println("图的边的集合=" + Arrays.toString(edges) + "共" + edges.length);//2.按照边的权值进行从小到大的排序sortEdges(edges);//3.遍历edges数组,将边添加到最小生成树时,判断准备加入的边是否会构成回路,如果没有就加入rets,否则不能加入for (int i = 0; i < edgeNum; i++) {//获取第i条边的第一个顶点(起点)int p1 = getPosition(edges[i].start);//获取到第i条边第2个顶点int p2 = getPosition(edges[i].end);//获取p1顶点在最小生成树的终点和 p2的顶点int m = getEnd(ends, p1);int n = getEnd(ends, p2);//4.判断是否构成回路if (m != n) { //终点不一致不构成回路——>m的顶点设置为n,也就是p1的顶点的顶点变为p2的顶点ends[m] = n; //设置m在已有最小生成树中的终点<E,F>[0,0,0,0,0,0,0,0,0,0,0]rets[index++]=edges[i];//有一条边加入到rets数组}}//5.输出最小生成树System.out.println("最小生成树为:");for (int i = 0; i < index; i++) {System.out.println(rets[i]);}}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/08rA00Dl.shtml

相关文章

第19章 随机波动率模型入门

这学期会时不时更新一下伊曼纽尔德曼&#xff08;Emanuel Derman&#xff09; 教授与迈克尔B.米勒&#xff08;Michael B. Miller&#xff09;的《The Volatility Smile》这本书&#xff0c;本意是协助导师课程需要&#xff0c;发在这里有意的朋友们可以学习一下&#xff0c;思…

欧内斯特·卢瑟福

Ernest Rutherford BiographyKathy老师讲述的有趣科学历史 01 欧内斯特卢瑟福 一、背景介绍 欧内斯特卢瑟福因其通过金箔实验发现了原子核而闻名于世。 实际上他的工作远多于此&#xff0c;甚至在他发现原子核之前就发现了几种不同形式的发射性、 发现化学元素可以衰变成其它…

クレス / 克雷斯

目录 基本资料面板值&#xff08;无天冥加成&#xff09;天冥奖励 战斗宣言&#xff08;VC&#xff09;技能珠子 回到人物索引 基本资料 NS(4~5★)协奏3入队 (Ver 2.7.50)時空剣士の史籍&#xff08;火精灵试炼报酬&#xff09; 天冥属性武器防具属性耐性异常耐性NS天火剑护…

改变世界的 17 个方程式( 17 Equations that Changed the World)

目录 勾股定理 对数 微积分 万有引力定律 复数 多面体欧拉定理 正态分布 波动方程 傅里叶变换 纳维-斯托克斯方程 麦克斯韦方程组 热力学第二定律 相对论 薛定谔方程 信息理论 混沌理论 布莱克-斯科尔斯公式 2013年&#xff0c;英国数学家伊恩斯图尔特&#x…

十二、计算期权定价和布莱克-斯科尔斯公式

期权定价 期权定价(Option Valuation),期权价值的两个基本构成要素是:内含价值和时间价值。 期权定价,内含价值,也称内在价值,是期权持有人因通过行权获得股票而不是直接购买股票而实现的收益。 布莱克-斯科尔斯公式 1997年10月10日,第二十九届诺贝尔经济学奖授予了…

布莱克—斯科尔斯—默顿(BSM)模型

BSM模型是最常用的期权定价模型之一&#xff0c;虽然其假设不合符市场事实&#xff0c;但是该模型的提出奠定了现代金融衍生品法则的基石。该模型在学界的发展&#xff1a;早期的期权定价大多采用Black-Scholes(B-S)期权定价模型&#xff0c;B-S模型假定标的资产收益率服从正态…

攻防世界 Misc miao~

得到一个jpg图片&#xff0c; 分离出jpg中隐含的内容&#xff0c;得到一个wav音频文件 在Audacity中打开&#xff0c;查看频谱图&#xff0c;得到密码CatCTF 在deepsound中打开wav文件&#xff0c;得到flag.txt 打开flag.txt发现是兽语 在线解码兽音译者在线编码解码 - 兽音翻…

[ CTF ]MISC flag

题目附件密码:7dm3 解压文件后仅有一个名为flag的文件&#xff1a; 首先&#xff0c;我们不知道这是个什么类型的文件。这题步骤不难思路难&#xff0c;看做题经验和积累了 1、直接把文件扔进十六进制 可以看到文件头是504B0304判断它可能是压缩包文件或者word文档&#xff0…

【ctf秀】【MISC】MISC入门misc10

一、解题环境 windows7 二、考点:binwalk的使用 考点发现及解题过程&#xff08;所有的png图片misc题均可这么做&#xff09;&#xff1a; 1.解压zip文件&#xff0c;用winhex打开misc10.png 2.判断文件格式是否篡改&#xff0c;检查png的文件头和文件尾&#xff0c;文件格式…

BUUCTF_MISC题解

BUUCTF_MISC题解 第二题 将GIF图片用ps进行逐帧分解&#xff0c;可以得到三张特殊的照片 直接将三个照片里的内容拼接起来就好 第三题 二维码 下载好附件解压后发现是一个.png文件的二维码 用CQR扫描后得到二维码的结果 发现并没有得到想要的flag&#xff0c;并且提示我们f…

MISC总结

文章目录 1.CTF中的压缩包1.1.练习11.2.练习21.3.练习31.4.练习41.5.练习51.6.练习61.7.练习71.8.练习81.9.练习91.10.练习10 2.基于BinWalk实现文件提取2.1.预备知识2.2.镜像文件提取数据 3.结构化文件信息隐藏3.1.预备知识 4.隐写4.1.图片隐写4.1.1.matlab图像处理4.1.2.LSB算…

Misc新手合辑

流量分析2 流量包数很少的分析 题目也没给别的文件,应该不用解加密的数据内容 那就康康有没有什么明文信息 过滤器输入http.request.method "GET"出来几个包: 从第一个包顺序开始右键follow一下,看一下http stream数据: 有fl可能是flag,加上follow出来的过滤器…

ctfshow misc入门wp

目录 图片篇&#xff08;基础操作&#xff09; misc1 misc2 misc3 misc4 图片篇&#xff08;信息附加&#xff09; misc5 misc6 misc7 misc8 ​misc9 misc10 misc11 misc12 ​misc13 misc14 misc15 misc16 misc17 misc18 misc19 misc20 misc21 misc22 …

BUUCTF MISC入门

1.gif 用firework 帧分解得到其中三帧中隐藏的flag 可以下载一个截图软件把各帧订住方便查看 注意&#xff1a;he11o不是hello(血与泪的教训) 2.二维码 看到二维码先是拿软件识别了一下&#xff0c;发现内容是secret is here,啥也没有 然后winhex发现里面有个txt 就放到linux下…

MISC相关工具下载

写在前面&#xff1a;本文包含在windows和在kali下使用的工具&#xff0c;win下已做标 MISC相关工具下载 图片相关 jpg f5-steganography (F5隐写&#xff0c;需要passwd) 安装 kali中安装&#xff1a; git clone https://github.com/matthewgao/F5-steganography > git clo…

攻防世界1-misc

1-misc 题目描述&#xff1a;无 题目环境&#xff1a;https://download.csdn.net/download/m0_59188912/87094807 打开压缩包&#xff0c;提示密码是出题人生日。 使用archpr爆破压缩包。 得到密码&#xff1a;20001228 解压压缩包&#xff0c;得到两个文件&#xff0c;一个图片…

ctfshow_MISC入门

目录 图片篇&#xff08;基础操作&#xff09; misc1 misc2 misc3 misc4 图片篇&#xff08;信息附加&#xff09; misc5 misc6 misc7&#xff08;flag在图片文件信息中&#xff09; misc8&#xff08;flag在图片文件中图片文件中&#xff09; misc9&#xff08;fla…

攻防世界_MISC之Misc文件类型

解压 Notepad打开文件&#xff0c;想到hex转ascii 转码后发现&#xff0c;这里BASE64字符反转了&#xff0c;应该提示这是base64编码&#xff0c;因为base64编码没有_下斜杠符号&#xff0c;所以删掉46ESAB_&#xff0c;然后再利用插件的base64解码 看见zip文件头PK&#xff0c…

攻防世界misc

目录 1. give_you_flag (二维码补全定位角) 2. 坚持60s (jar包反编译) 3. 如来十三掌 4. gif 5. stegano 6. 掀桌子 7. SimpleRAR 8. ext3 9. 功夫再高也怕菜刀 10. Wireshark 1. give_you_flag (二维码补全定位角) 附件得到一个gif动图&#xff0c;用stegsolve Fra…

Misc(buuoj)

一、[GWCTF2019]math 二、[BSidesSF2020]mpfrag [GWCTF2019]math 开启靶机连接环境。题目给出了一个算式&#xff0c;但是算不了几秒就退出了。 同时还给了我们源程序:"gwctf_2019_math"。 放到IDA64里看一下&#xff0c;找到它的主函数。 int __cdecl main(int…