散100分求普里姆算法和克鲁斯卡尔算法的C语言实现代码!!急!!!!!

iter_zc 2004-12-29 06:32:44
高手请帮小弟一把,急求普里姆算法和克鲁斯卡尔算法的C语言实现代码!!!万分感谢!!!!
...全文
538 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
iter_zc 2004-12-30
  • 打赏
  • 举报
回复
万分感谢啊!!!!
dzy1982 2004-12-30
  • 打赏
  • 举报
回复
找本数据结构的书,里面有
bill_li 2004-12-29
  • 打赏
  • 举报
回复
真的,好强呀
吴大猫 2004-12-29
  • 打赏
  • 举报
回复
图的存储结构定义
#define MGRAPH_H
#define INFINITY 100
#define MAX_VERTEX_NUM 20

typedef int VRType;
typedef char InfoType;
typedef char VertexType;
typedef enum { DG,DN,UDG,UDN } GraphKind;
typedef struct {
VRType adj;
InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
AdjMatrix arcs;
int vexnum,arcnum;
GraphKind kind;
}MGraph;

边集数组类型定义
typedef struct {
int fromvex;
int endvex;
int weight;
}edge;
typedef struct {
edge *set;
int arc_num;
int vex_num;
}edgeset;

typedef struct listnode{
int adjvex;
int weight;
struct listnode *next;
}listnode;
typedef listnode* adjlist[MAX_VERTEX_NUM];

//该算法中的图用邻接矩阵存储,CT为存储着最小生成树的边集数组
void Prim(MGraph g,edgeset *CT,int sta_vex) //sta_vex是初始点
{
int i,j,k,min,m,p,w;
int tm_frvex,tm_envex,tm_weight;
int t = 0;

//给CT赋初值
for(i=0; i<CT->vex_num; i++)
if(g.arcs[sta_vex][i].adj!=0) {
CT->set[t].fromvex = sta_vex;
CT->set[t].endvex = i;
CT->set[t].weight = g.arcs[sta_vex][i].adj;
t++;
}

//进行n-1次循环,每次求出最小生成树的第k条边
for(k=1; k<=g.vexnum-1; k++) {
min = INFINITY;
m = k - 1;
//从CT[k-1]到CT[n-2]中查找最短边
for(i=k-1;i<g.vexnum-1;i++)
if(min>CT->set[i].weight) {
min = CT->set[i].weight;
m = i;
}
//把最短边调到第k-1下标位置
tm_frvex = CT->set[k-1].fromvex;
tm_envex = CT->set[k-1].endvex;
tm_weight = CT->set[k-1].weight;
CT->set[k-1].fromvex = CT->set[m].fromvex;
CT->set[k-1].endvex = CT->set[m].endvex;
CT->set[k-1].weight = CT->set[m].weight;
CT->set[m].fromvex = tm_frvex;
CT->set[m].endvex = tm_envex;
CT->set[m].weight = tm_weight;
//把新并入最小生成树的顶点序号副给p
p = CT->set[k-1].endvex;
//修改CT有关边,使CT中到CT外的每一顶点各保持一条目前为止最短的边
for(i=k; i<g.vexnum-1; i++) {
j = CT->set[i].endvex;
w = g.arcs[p][j].adj;
if(w<CT->set[i].weight && p!=j) {
CT->set[i].weight = w;
CT->set[i].fromvex = p;
}
}
}
}

//ET1是已排好序的边集数组,ET2返回最小生成树,G是图的邻接矩阵表示
void Kruskal(edgeset ET1,edgeset *ET2,MGraph G)
{
int i,j,k,m1,m2,flag,tag; //m1,m2 分别用来表示ET1[i]中两个顶点所在集合的序号
adjlist alist; //邻接表alist作为集合使用,其中每一个单链表alist[i]用来
//表示一个集合,若一个顶点属于这个集合,则对应该单链表中的
//一个结点,该结点的adjvex域的值为该顶点序号
listnode *p,*q;

for(i=0; i<G.vexnum;i++) {
p = (listnode*)malloc(sizeof(listnode));
p->adjvex = i;
p->next = NULL;
alist[i] = p;
}

i = 0,k = 1; //k表是待取的最小生成树的边数,初值为1,i表示ET1中待扫描边的下标位置
//进行n-1次循环,得到生成树n-1条边
while(k<G.vexnum) {
m1 = ET1.set[i].fromvex;
m2 = ET1.set[i].endvex;
flag = 1;
tag = 0;
for(j=0; j<G.vexnum&&flag; j++) { //求边ET[j]中的两个顶点所在集合的序号m1,m2
p = alist[j];
while(p&&flag) {
if(p->adjvex == m1) {
m1 = j;
tag++;
}
if(p->adjvex == m2) {
m2 = j;
tag++;
}
if(tag == 2) flag = 0;
p = p->next;
}
}
//若两个集合序号不等,则表明ET[i]是生成树的一条边,应把他加入到边集数组ET2中
if(m1 != m2) {
//合并两个集合,并将另一个置为空
p = alist[m1];
while(p->next) p = p->next;
p->next = alist[m2];
alist[m2] = NULL;
ET2->set[k-1].fromvex = ET1.set[i].fromvex;
ET2->set[k-1].endvex = ET1.set[i].endvex;
ET2->set[k-1].weight = ET1.set[i].weight;
k++;
}
i++;
}
for(i=0; i<G.vexnum; i++) {
p = alist[i];
while(p) {
q = p;
p = p->next;
free(q);
}
}
ET2->arc_num = G.vexnum - 1;
ET2->vex_num = G.vexnum;
}
truewill 2004-12-29
  • 打赏
  • 举报
回复
-_-
听都没听过,人命不如写英文吧
代码转载自:https://pan.quark.cn/s/2af55a97eb0f **INA226测试程序参考** 在电子工程和嵌入式系统开发领域,INA226被认为是一款高精度且低功耗的电流与电源监控器,其应用范围广泛,涵盖电池管理系统、电源路径管理以及智能能源监测等多个方面。该芯片由德州仪器(Texas Instruments)负责生产,能够提供精确的电流和电压测量结果,并具备灵活的配置选择。 **INA226芯片功能详解** INA226的核心特性包括: 1. **双向电流测量**:能够测量流经设备的正向电流和反向电流。 2. **高压和低压测量**:支持高达60V的电压测量,同时可以测量从微安到安培范围内的电流。 3. **内置模拟电路**:集成了一个精密运算放大器、一个电流检测放大器以及一个高精度电压基准。 4. **I2C接口**:通过标准的I2C接口与微控制器进行通信,便于读取测量数据。 5. **多种配置模式**:允许选择不同的电流和电压范围,以适应不同应用场景的需求。 6. **低功耗**:在待机状态下,功耗非常低,适合用于电池供电的设备。 **平台IO与ESP8266开发环境** `PlatformIO`是一个开源的跨平台集成开发环境,专注于物联网(IoT)项目的开发。它整合了构建系统、库管理和设备支持,显著简化了嵌入式开发流程。`ESP8266`是由乐鑫科技推出的一款低成本且高性能的Wi-Fi微控制器,常用于智能家居和物联网领域。 在`PlatformIO`中配置和编写针对`ESP8266`的INA226测试程序,需要遵循以下步骤: 1. **安装PlatformIO**:在IDE(例如Visual Studio Code、Atom等...
已经博主授权,源码转载自 https://pan.quark.cn/s/6b24333d46cf 这里所说的激光扫描测距仪的实质就是3D激光雷达。 如上面视频中展现的那样,扫描仪可 以获取各转角情况下目标物体扫描截面到扫描仪的距离,由于这类数据在可视化后看起来像 是由很多小点组成的云团,因此常被称之为:点云(PointClould)。 在获得扫描的点云后,可以在计算机中重现扫描物体/场景的三维信息。 自制激光3D扫描仪的知识点涵盖了多个方面,包括激光雷达的基本概念、激光扫描测距的原理、以及如何低成本实现3D激光扫描。 以下是对这些知识点的详细阐述。 激光雷达是一种通过激光测距获取物体表面信息的设备。 它通常用于机器人导航、3D模型重建和地图测绘等领域。 激光雷达能够获取目标物体在各个转角情况下的扫描截面到扫描仪的距离,并将这些数据可视化成点云(Point Cloud)。 点云是由大量小点组成的三维数据模型,这些小点模拟了物体或场景的三维结构。 在制造激光3D扫描仪时,需要考虑的关键原理包括激光三角测距原理和线状激光进行截面测距的原理。 激光三角测距原理是指通过测量发射激光与反射激光之间的角度差异来确定距离。 而线状激光进行截面测距原理则是指将点状激光改变成线型光束,一次性获得整个扫描截面的数据。 市面上的激光雷达产品价格昂贵,主要因素包括使用高速光学振镜进行大角度扫描、通过计算发射/反射激光束相位差的测距手段、以及矫正算法和人工成本。 但个人DIY自制激光雷达时,可以通过降低对精度和性能的要求来大幅降低成本。 例如,使用三角测距方式替代成本较高的TOF测距方式,或者使用普通电机机构驱动激光器来替代高速振镜。 自制激光3D扫描仪的实现,可以考虑制作一个能够测量一个点的设备,并采用类似的三角测距...

15,446

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧