2023/4/13总结

news/2024/12/22 11:07:28/

最小生成树

一、Prim算法

1.prim算法也被称为“加点法”,因为该算法是先从任意一顶点出发不断的选择目前距离最近且未被选择的点加入到已选的集合中,直到所有的点都被选到。(和最短路径中的Dijkstra算法很像)

2.prim算法的实现

  • 首先将初始顶点u加入集合U中,然后用一个数组dis记录下其余点vj到顶点u的边权信息(dis[k]代表从u到k的权为dis[k])。
  • 然后设置一个循环循环,循环n-1次即可。(n为顶点数所以要将每个点连接起来至少需要n-1条边)循环中先在dis数组中找到权值最小的顶点k,用一个变量累加这条边的权值。然后将这个顶点k加入集合U,相当于新增加了一条从k到j的边,再将dis数组更新为新的权值。

 3.prim算法的时间复杂度是O(n*n)与该网中的边数无关,因此适用于稠密图的最小生成树。

4.代码如下:

#include"stdio.h"
main()
{int n,m,i,j,k,min,t1,t2,t3;int e[7][7],dis[7],book[7]={0};int inf=99999999;int count=0,sum=0;scanf("%d %d",&n,&m);for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(i==j) e[i][j]=0;else e[i][j]=inf;for(i=1;i<=m;i++){scanf("%d %d %d",&t1,&t2,&t3);e[t1][t2]=t3;e[t2][t1]=t3;}for(i=1;i<=n;i++)dis[i]=e[1][i];book[1]=1;count++;while(count<n){min=inf;for(i=1;i<=n;i++){if(book[i]==0&&dis[i]<min){min=dis[i];j=i;}}book[j]=1;count++;sum=sum+dis[j];for(k=1;k<=n;k++){if(book[k]==0&&dis[k]>e[j][k])dis[k]=e[j][k];} }printf("%d",sum);
} 

 二、kruskal算法

1.该算法为“加边法”,每一次都选择插入目前还未被加入最小生成树的一条边插入到最小生成树中,直到加入了n-1条边,将n个顶点相连。

2.kruskal算法实现:

  • 将存储边的结构体数组(该结构体中有两个元素代表边的两个顶点)中的元素按权值从小到大排序。
  • 每一次从排好序的数组中选出一条边,对这两个顶点进行判断看这两个点是否是分属于不同的连通分量,如果不等则合并这两个连通分量。如果它们属于同一个连通分量,则舍去这条边,选择下一条边进行判断。

3.关键代码如下:

  for(i=1;i<=m;i++)//开始从小到大枚举每一条边{if(merge(e[i].u,e[i].v))//判断一条边的两个顶点是否已经连通,即判断是否已在同一个集合中{count++;//如果目前尚未不连通,则选用这条边sum=sum+e[i].w;}if(count==n-1 ) break;//直到选用了n-1条边之后退出循环}

 三、prim算法和kruskal算法的区别

1.prim是加点法,每一次都选择增加一条边来建立一棵树。prim每次都是选择距离生成树最近的边。

2.Kruskal是加点法,按照从小到大的顺序去考察每一条边,每次都是先给最小边机会。

3.前者常用于稠密图,后者常用于稀疏图。

 

 


http://www.ppmy.cn/news/46855.html

相关文章

文件操作【下篇】

文章目录 &#x1f5c3;️5.文件的随机读写&#x1f4c1;5.1. fseek&#x1f4c1;5.2. ftell&#x1f4c1;5.3. rewind &#x1f5c3;️6.文本文件和二进制文件&#x1f5c3;️7.文件读取结束的判定&#x1f4c1;7.1. 被错误使用的 feof &#x1f5c3;️8.文件缓冲区 &#x1f…

折叠屏市场起风,华为、OPPO“你追我赶”

配图来自Canva可画 现如今&#xff0c;智能手机已经成为了人们生活中不可或缺的重要工具&#xff0c;无论是出行&#xff0c;还是社交&#xff0c;亦或是支付&#xff0c;只需要一部智能手机就可以通通搞定。因此&#xff0c;在消费者多样化需求的助推下&#xff0c;智能手机行…

研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型)

研读Rust圣经解析——Rust learn-3&#xff08;变量与可变性&#xff0c;数据类型&#xff09; 变量|常量与可变性变量声明案例为什么不可变变量可变&#xff08;mut关键字&#xff09;变量可变&#xff08;覆盖&#xff09; 常量声明 数据类型标量类型整型整型字面值整型溢出问…

Go分布式爬虫笔记(二十二)

文章目录 22 辅助任务管理&#xff1a;任务优先级、去重与失败处理设置爬虫最大深度避免请求重复设置优先队列设置随机User-Agent失败处理 22 辅助任务管理&#xff1a;任务优先级、去重与失败处理 设置爬虫最大深度 目的: 防止访问陷入到死循环控制爬取的有效链接的数量 最…

ChatGPT实战100例 - (09) Python工具类库终结者

文章目录 ChatGPT实战100例 - (09) Python工具类库终结者一、需求与思路二、时间工具三、扩充工具四、编写测试五、 总结 ChatGPT实战100例 - (09) Python工具类库终结者 一、需求与思路 自从用了ChatGPT&#xff0c;再也不用满大街找工具类了。 需要啥工具&#xff0c;咱用C…

数据结构入门(C语言版)二叉树概念及结构(入门)

二叉树概念及结构&#xff08;入门&#xff09; 树的概念及结构1.树的概念及结构1.1 树的概念1.2 树的相关知识1.3 树的结构体表示1.4 树的实际运用 2.二叉树概念及结构2.1 二叉树的概念2.2 现实中的二叉树2.3 特殊的二叉树2.4 二叉树的性质2.5 二叉树的存储结构 结语 树的概念…

根据 cadence 设计图学习硬件知识 day01了解腾锐 D2000芯片

1. 首先了解 腾锐 D2000 1.介绍 腾锐D2000 芯片 D2000芯片集成8个飞腾自主研发的新一代高性能处理器内核FTC663&#xff0c;采用乱序四发射超标量流水线&#xff0c;兼容64位ARMV8指令集并支持ARM64和ARM32两种执行模式&#xff0c;支持单精度、双精度浮点运算指令和ASIMD处…

设计模式 -- 门面模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…