最小生成树

最小生成树算法总结 算法总结第5弹,最小生成树,有关生成树的问题有很多,这里先介绍个最常用的吧。 最小生成树 首先,生成树是建立在无向图中的,对于有向图,则没有生成树的概念,所以接下来讨论的图均默认为无向图。对于一个有n个点的图,最少需要n-1条边使得这n个点联通,由这n-1条边组成的子图则称为原图的生成树。一般来说,一个图的生成树并不是唯一的(除非原图本身就是一棵树)。 现在考虑带权图G,即图的边带权,则 阅读详情

# include <stdio.h>
# define MAX_VERTEX_NUM 20
# define INFINITY 32768
# define Error -1
# define OK 1

typedef int AdjType;
typedef enum{DG,DN, UDG,UDN} GraphKind;
typedef char VertexData;
struct
{
 VertexData adjvex;
 int lowcost;
}closedge[MAX_VERTEX_NUM];
typedef struct ArcNode
{
 AdjType adj;
// OtherInfo info;
}ArcNode;

typedef struct
{
 VertexData vertex[MAX_VERTEX_NUM];
 ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
 int vernum, arcnum;
 GraphKind kind;
}AdjMatrix;

int LocateVertex(AdjMatrix *g, VertexData v)        //求顶点位置函数
{
 int j = Error, k;
 for (k = 0; k <g->vernum; k++)
  if (g->vertex[k] == v)
  {
   j = k;break;
  }
  return j;
}

int CreateDN(AdjMatrix *g)               //创建图的邻接矩阵
{
 int i,j,k,weight;
 VertexData v1, v2;
 printf("请输入图的顶点数和弧数\n");
 scanf("%d%d", &g->vernum, &g->arcnum);
 for (i = 0; i < g->vernum;i++)
  for (j = 0; j < g->vernum; j++)
   g->arcs[i][j].adj = INFINITY;
 printf("请输入图的顶点\n");
 getchar();
 for (i = 0; i < g->vernum; i++)
  scanf("%c", &g->vertex[i]);
 printf("请输入每条弧的两个顶点及权值\n");
 getchar();
 for (k = 0; k < g->arcnum; k++)
 {
  scanf("%c%c%d%c", &v1,&v2,&weight);
  i = LocateVertex(g,v1);
  j = LocateVertex(g,v2);
  g->arcs[i][j].adj = weight;
  g->arcs[j][i].adj = weight;
 }
/* for (i = 0; i<g->vernum  ;i++)
 {
  for (k=0; k < g->vernum  ;k++)
   printf("%d     ",g->arcs[i][k].adj);
  printf("\n");
 }
*/ return OK;
}

int Minium(AdjMatrix *g)          //找去closedge[]中最小边的信息
{
 int i,index,sum = INFINITY;
 for (i = 0; i < g->vernum; i++)
  if (closedge[i].lowcost != 0 && sum > closedge[i].lowcost)
  {
   sum = closedge[i].lowcost;
   index = i;
  }
 return index;

}
void  MiniSpanTree_prim(AdjMatrix *g,VertexData u)            //普利姆算法(最小生成树)
{
 int i,k,k0,j;
 VertexData v0,u0;
 k = LocateVertex(g,u);
 closedge[k].lowcost = 0;
 for (i = 0; i < g->vernum ; i++)
  if (i!= k)
  {
   closedge[i].adjvex = u;
   closedge[i].lowcost = g->arcs[k][i].adj;
  }
 printf("最小生成树的边为\n");
 for (j = 1; j < g->vernum ; j++)
 {
  k0 = Minium(g);
  u0 = closedge[k0].adjvex;
  v0 = g->vertex[k0];
  printf("%c%c\n",u0,v0);
  closedge[k0].lowcost = 0;
  for (i = 0; i < g->vernum ; i++)
   if (g->arcs[k0][i].adj < closedge[i].lowcost)
   {
    closedge[i].lowcost = g->arcs[k0][i].adj;
     closedge[i].adjvex = v0;
   }
 }
}
int main(void)
{
 VertexData u;
 AdjMatrix g;
 CreateDN(&g);
 printf("请输入最小生成树的开始顶点\n");
 scanf("%c", &u);
 MiniSpanTree_prim(&g,u);

 return 0;
}

什么是最小生成树以及如何构建 文章目录一,概念回顾 - 生成树1.1 什么是生成树1.2 如何建立无向图的生成树二,最小生成树(Minimum Spanning Trees)2.1 最小生成树的典型用途2.2 构造最小生成树(MST)2.2.1 MST 性质2.2.2 Prim 算法构建最小生成树2.2.3 Kruskal 算法构建最小生成树2.2.4 Prim 与 Kruskal 算法比较 预习:图的基本概念及图演算法 一,概念回顾 - 生成树 1.1 什么是生成树 生成树:所有顶均由边链接在一起,但不存在回路的图。 多一条边会出现 阅读详情

相关推荐

算法——最小生成树

最小生成树(Minimum Spanning Tree,简称MST)是指一张连通图的子图,它包含图中的所有顶点,并且是图中所有生成树中权值之和最小的一个。最小生成树常用于解决网络设计、电力传输、道路规划等问题。祝您好运!

百锦再的博客 1万+

UESTC - 1830 秦队长猜想

题目描述 :    秦队长猜想:“任何一个大于等于6的整数都能写成三个质数的和。“现给你一个N,请你构造三个质数x,y,z,使得x+y+z=N 输入描述 :         一行,仅一个整数N(6&lt;=N&lt;=10 9 )          N(6&lt;=N&lt;=109).输出描述  :       一行,三个质数x,y,z,以空格隔开。       如果有多组解,你只用需输出任意一...

black_horse2018的博客 419

Arduino Nano + MCP3422A0 ADC 毫欧表:3档分辨率(0.1mΩ-1.3kΩ)开尔文连接实测

本文详细介绍了如何使用Arduino Nano与MCP3422A0 ADC构建高精度毫欧表,采用四线制开尔文连接和三档量程设计,实现0.1mΩ-1.3kΩ的精确测量。通过精密恒流源和18位ADC技术,结合智能量程切换和数字滤波算法,显著提升测量精度和稳定性,适用于电子维修、PCB测试等场景。

weixin_28292761的博客 325

图的最小生成树——Kruskal算法

Kruskal算法的基本思想用伪代码描述如下:1. 初始化:U=V;TE={ }; 2. 重复下述操作直到T中的连通分量个数为1: 2.1 在E中寻找最短边(u,v); 2.2 如果顶点u、v位于T的两个不同连通分量,则 2.2.1 将边(u,v)并入TE; 2.2.2 将这两个连通分量合为一个; 2.3 标记边(u,v),使得(u...

arthu6的博客 816

ACR 磁共振安全手册 2024 更新版:全面保障 MRI 安全实践

MR 环境:MR 系统周围的三维空间,包含法拉第屏蔽体积和 9 高斯线,医疗设备在此区域可能因暴露于 MR 设备产生的电磁场而构成危险,需进行访问控制以降低风险MR 受控访问区域:MR 系统周围的局部定义区域,包含 MR 环境(包括其静磁场),访问仅限于授权人员MR 抛射物区域:围绕 MRI 系统的 IV 区区域,铁磁物体在此有成为抛射物的风险图一 磁共振环境:场地规划与区域划分。

楚山之石的博客 2604

合成生物学中试:花钱只是开始,烧钱才是常态

2026年合成生物学行业面临严峻产业化挑战:多家企业终止发酵项目或延期投产,显示从实验室到工厂的转化困境。核心问题并非基因合成成本,而是工艺放大难题——67%项目在中试阶段因工艺问题失败。AI辅助无法替代工程经验,菌株-配方-工艺的三元适配需要长期数据积累。中试成本惊人,涉及设备折旧、原料消耗和稀缺工艺人才,而行业普遍回避讨论这些工程现实,导致认知偏差。建议创业者提前布局中试,将其视为核心竞争力而非简单成本项。合成生物学的真正瓶颈在于工程化能力,这需要时间沉淀而非技术叙事。

AIexander的博客 943

牛客小白月赛6 - H.挖沟(Kruskal)

胡队长带领HA实验的战士们玩真人CS,真人CS的地图由一些据点组成,现在胡队长已经占领了n个据点,为了方便,将他们编号为1-n,为了隐蔽,胡队长命令战士们在每个据点出挖一个坑,让战士们躲在坑里。由于需要在任意两个点之间传递信息,两个坑之间必须挖出至少一条通路,而挖沟是一件很麻烦的差事,所以胡队长希望挖出数量尽可能少的沟,使得任意两个据点之间有至少一条通路,顺便,尽可能的∑d[i][j]使最小(其中...

PleasantlY1的博客 515

✨使用 vLLM + Docker 部署 Qwen3-Embedding-8B 并实现高效文本向量生成(附 `curl` 测试)

本文介绍了如何使用 vLLM 和 Docker 部署 Qwen3-Embedding-8B 嵌入模型服务,并通过标准 OpenAI 兼容接口进行调用和结果解析。如果你在部署中遇到任何问题,欢迎留言讨论!

用大模型重构生活:猫奴程序员的AI智能日常记录 6243

最小生成树—prime算法

生成树 一个连通图的生成树是该连通图的一个极小连同子图,它含有图中全部顶点,和构成一棵树的(n-1)条边。 如果在一棵生成树上添加任何一条边,必定构成一个环,因为这条边使得它依附的那两个顶点之间有了第二条路径。 一棵有n个顶点的生成树(连通无回路图)有且仅有(n-1)条边,但是,有(n-1)条边的图不一定都是生成树。如果一个图有n个顶点和小于(n-1)条边,则是非连通图;如果它有多于(n-1)条边,则一定有回路。 如果图中任意两点都是连通的,那么图被称作连通图。 如果此图是有向图,且双向都有路径,则称为强

weixin_46157720的博客 1万+

unity shader 后处理实现水墨风格渲染「Low Poly 」变「水墨画 」

水墨风格渲染 这次学校的比赛打算做一个中国古代背景的游戏,所以尝试做了水墨风格的渲染。 主要按以下四步来实现的效果: 根据色调和饱和度调整饱和度。 对图像进行模糊 水墨风格的物体边缘 物体内画笔笔触的模拟 接下来我分别就这四步依次展开说明: 调整饱和度 这里我使用Post-Processing Stack 的Color Grading 来调节饱和度,通过使用Grading Curv...

九级铁甲蛹的博客 1万+

nginx配置视频流加密防盗链(一)安装nginx插件

前段时间研究了一下视频流的简单加密防盗链,参考了很多文章,最后总算搞出来了。现在自己总结了一下。

u013294657的博客 1869

prim算法求最小生成树

最小生成树(Minimum Spanning Tree,简称MST)是图论中的一个概念。给定一个连通的无向图,最小生成树是指包含图中所有顶点的一棵树,且该树的所有边的权重之和最小。连通性:最小生成树必须包含图中的所有顶点,并且通过边将它们连接起来,确保整个图是连通的,即任意两个顶点之间都有路径。(一颗有 n 个顶点的生成树有且仅有 n−1 条边,如果生成树中再添加一条边,则必定成环。无环:最小生成树是一棵树,所以不能包含任何环(即回路)。最小权重:最小生成树的边权重之和应当尽可能地小。

sin1810335764的博客 4676

langchain4j+milvus实战

本文主要研究一下如何使用langchain4j来对接向量数据库milvus。

go4it 1474

MATLAB 最小生成树

本文介绍了 MATLAB 中如何求解最小生成树。

小嗷犬的博客 4430

【PX4学习笔记】3. PX4 固件烧写(1 探索过程)

飞控型号:cube orange【PX4官方用户指南中关于cube orange的描述】 飞控载板型号:Mini Carrier Board【迷你载板说明文档】 固件安装参考:The Cube User Manual V1.0

【人工智障 | 计算鸡视觉 | 机器孩】 7677

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

最小生成树算法的相关变形题

由于吉大近几年的考试中,算法大题里频繁地出现最小生成树算法的变形题,因此在此整理一下。PS:prim算法不管是画图还是代码题真的难用,kruskal算法才是永远滴神。

销夜的博客 1932

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

最小生成树刷题汇总

Acwing 346 走廊泼水节 给定一棵 N 个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树。 求增加的边的权值总和最小是多少。 注意: 树中的所有边权均为整数,且新加的所有边权也必须为整数。 输入格式 第一行包含整数 tt,表示共有 tt 组测试数据。 对于每组测试数据,第一行包含整数 NN。 接下来 N−1N−1 行,每行三个整数 X,Y,ZX,Y,Z,表示 XX 节点与 YY 节点之间存在一条边,长度为 ZZ。 输出格式 每组数据输出一个整数,表示权值总和最

徒手拆机甲的博客 1933

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

图论:最小生成树

本文介绍了两种最小生成树算法:Prim算法和Kruskal算法。Prim算法采用贪心策略,从节点角度构建最小生成树,通过维护节点到树的距离实现优化,适用于稠密图,时间复杂度为O(V²)或O(ElogV)。Kruskal算法通过边构建最小生成树,使用并查集判断连通性,按边权排序后逐步选择边,适用于稀疏图,时间复杂度为O(ElogE)。文章详细分析了两种算法的实现步骤、模板代码(包括邻接矩阵和邻接表版本)以及适用场景,并通过寻宝问题展示了具体应用。两种算法各有优势,应根据图的稠密程度选择合适的实现方式。

豪德又AC啦 1835

最小生成树详解

本文介绍了最小生成树的概念及其两种主要算法:Kruskal算法和Prim算法。Kruskal算法通过按边权排序并利用并查集避免环来构建最小生成树,适合稀疏图;Prim算法则从原点出发逐步扩展最近节点,适合稠密图。文章还通过多个例题(如繁忙的都市、无线通讯网等)展示了算法的应用,并介绍了超级源点等技巧。最后强调深入理解树结构是解决此类问题的关键,建议通过多做题来提高解题能力。不同问题需要灵活选择算法,构建特殊的最小生成树来满足需求。

joezhoutj的博客 818

最小生成树的一些性质和理解

1)       定义在一棵树里添加一条边,并在产生的圈里删除一条边叫做一次操作。(也就是说换掉一条边并且保证结果是树),则树A和B是无向图的两个生成树,则A可以通过若干次操作变成B。   证:把树看作边的集合,如果B中有一条A没有的边,则把这条边加到A上,A产生一个圈中至少有一条是B中没有的边,把这条边删掉,则A仍然是生成树,A,B集合相同的边多了一条,重复这个过程直到A B包含的边相同。

zengchenacmer的专栏 9133

图论——最小生成树

最小生成树(MinimumSpanningTrees)的概念连通图的一颗生成树(SpanningTree)是包含图的所有顶点的连通无环子图(也就是一棵树)。加权连通图的一颗最小生成树是图的一颗权重最小的生成树,其中,树的权重定义为所有边的权重总和。)将加权图每个顶点都看做森林,然后将图中每条邻接边的边权按照升序的方式进行排列,接着从排列好的邻接边表中抽取边权最小的边,写入该边的起始顶点和结束顶点,连接顶点将森林构成树,然后读取起始结束顶点的邻接边,优先抽取边权小的邻接边,继续连接顶点将森林构成树。...

faith_xy的博客 3766
上一篇: NYOJ221Tree
下一篇: 图的深度优先搜索和广度优先搜索
java_oracle_c
博客等级 码龄13年 2粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值