首页 > 编程语言 >6-1 最小生成树(普里姆算法)

6-1 最小生成树(普里姆算法)

时间:2023-06-20 15:12:29浏览次数:42  
标签:vexnum char 普里 int 最小 MVNum closedge AMGraph 算法

试实现普里姆最小生成树算法。

一、函数接口定义:

void Prim(AMGraph G, char u);

其中 G 是基于邻接矩阵存储表示的无向图,u表示起点

二、裁判测试程序样例:

#include <iostream>
#define MVNum 10
#define MaxInt 32767 
using namespace std;

struct edge{
    char adjvex;
    int lowcost;
}closedge[MVNum];

typedef struct{ 
    char vexs[MVNum];   
    int arcs[MVNum][MVNum]; 
    int vexnum,arcnum;
}AMGraph;
int LocateVex(AMGraph G , char v);//实现细节隐藏
int Min(AMGraph G);//实现细节隐藏
int CreateUDN(AMGraph &G);//实现细节隐藏

void Prim(AMGraph G, char u);

int main(){
    AMGraph G;
    CreateUDN(G);
    char u;
    cin >> u;
    Prim(G , u);
    return 0;
}

/* 请在这里填写答案 */

三、输入样例:

第1行输入结点数vexnum和边数arcnum。第2行输入vexnum个字符表示结点的值,接下来依次输入arcnum行,每行输入3个值,前两个字符表示结点,后一个数表示两个结点之间边的权值。最后一行输入一个字符表示最小生成树的起始结点。

7 9
0123456
0 1 28
0 5 10
1 2 16
1 6 14
2 3 12
3 6 18
3 4 22
4 5 25
4 6 24
0

四、输出样例:

按最小生成树的生成顺序输出每条边。

0->5
5->4
4->3
3->2
2->1
1->6

全部代码如下:

#include <iostream>
#define MVNum 10
#define MaxInt 32767
using namespace std;

struct edge {
    char adjvex;
    int lowcost;
} closedge[MVNum];

typedef struct {
    char vexs[MVNum];
    int arcs[MVNum][MVNum];
    int vexnum, arcnum;
} AMGraph;

int LocateVex(AMGraph G, char v)
{
    // 实现细节隐藏
    // 这个函数用于定位顶点 v 在图 G 中的位置,返回顶点在 vexs 数组的下标
    // 可以使用 for 循环遍历 vexs 数组,找到与 v 匹配的顶点并返回下标
    for (int i = 0; i < G.vexnum; i++) {
        if (G.vexs[i] == v) {
            return i;
        }
    }
    return -1;  // 如果 v 不在 vexs 数组中,则返回 -1
}

int Min(AMGraph G)
{
    // 实现细节隐藏
    // 这个函数用于从 closedge 数组中选择权值最小的边并返回其下标
    // 可以使用循环遍历 closedge 数组,找到权值最小的边并返回其下标
    int minCost = MaxInt;
    int minIndex = -1;
    for (int i = 0; i < G.vexnum; i++) {
        if (closedge[i].lowcost < minCost && closedge[i].lowcost != 0) {
            minCost = closedge[i].lowcost;
            minIndex = i;
        }
    }
    return minIndex;
}

int CreateUDN(AMGraph& G)
{
    // 实现细节隐藏
    // 这个函数用于创建无向带权图 G
    // 可以根据需要设置图的顶点数和边数,并通过键盘输入顶点和边的信息
    // 可以使用嵌套循环来输入每条边的权值,如果两个顶点之间没有边,可以将对应位置的边权值设置为 MaxInt
    cout << "请输入顶点数和边数:";
    cin >> G.vexnum >> G.arcnum;

    cout << "请输入" << G.vexnum << "个顶点(用空格分隔):";
    for (int i = 0; i < G.vexnum; i++) {
        cin >> G.vexs[i];
    }

    for (int i = 0; i < G.vexnum; i++) {
        for (int j = 0; j < G.vexnum; j++) {
            G.arcs[i][j] = MaxInt;
        }
    }

    cout << "请输入" << G.arcnum << "个边的信息(起点 终点 权值):";
    for (int k = 0; k < G.arcnum; k++) {
        char v1, v2;
        int weight;
        cin >> v1 >> v2 >> weight;
        int i = LocateVex(G, v1);
        int j = LocateVex(G, v2);
        G.arcs[i][j] = weight;
        G.arcs[j][i] = weight; // 无向图,边是双向的,需要添加两条边
    }

    return 0;
}

void Prim(AMGraph G, char u)
{
    int uIndex = LocateVex(G, u);
    for (int i = 0; i < G.vexnum; i++) {
        if (i != uIndex) {
            closedge[i].adjvex = u;
            closedge[i].lowcost = G.arcs[uIndex][i];
        }
    }
    closedge[uIndex].lowcost = 0;

    for (int k = 1; k < G.vexnum; k++) {
        int minIndex = Min(G);
        cout << closedge[minIndex].adjvex << " -> " << G.vexs[minIndex] << endl;
        closedge[minIndex].lowcost = 0;

        for (int i = 0; i < G.vexnum; i++) {
            if (G.arcs[minIndex][i] < closedge[i].lowcost) {
                closedge[i].adjvex = G.vexs[minIndex];
                closedge[i].lowcost = G.arcs[minIndex][i];
            }
        }
    }
}

int main()
{
    AMGraph G;
    CreateUDN(G);
    char u;
    cout << "请输入起始顶点:";
    cin >> u;
    Prim(G, u);
    return 0;
}

标签:vexnum,char,普里,int,最小,MVNum,closedge,AMGraph,算法
From: https://www.cnblogs.com/yzx-sir/p/17493680.html

相关文章

  • 【机器学习】最小二乘法(代数&矩阵推导)
    前置知识平方损失函数假设上图的红线就是拟合出的函数,那么每个数据点(xi,yi)所对应的误差就是上面的误差往往也称之为「残差」。但是在机器学习中,我们更喜欢称作「损失」,即真实值和预测值之间的偏离程度。那么,对......
  • labview最小二乘法拟合曲线报表生成,波形拟合最小二乘法 Lab
    labview最小二乘法拟合曲线报表生成,波形拟合最小二乘法LabVIEW是一种流程图编程语言和开发环境,用于控制和测量系统的自动化。最小二乘法是一种数学优化技术,用于拟合数据点到一个函数曲线上。在LabVIEW中,可以使用最小二乘法来生成报表和进行波形拟合。最小二乘法是一种通过最小化数......
  • vs2010mfc界面开发的空间b样条曲线插补算法。 vs2010mfc界面开发的
    vs2010mfc界面开发的空间b样条曲线插补算法。vs2010mfc界面开发的空间b样条曲线插补算法。文件包含的是空间B样条曲线插补,里面可以实现刀轨的生成调节刀轨的速度,曲线的空间旋转和平移,以及加工过程的G代码和步长的生成和设置,可以手动输入数据点,或者生成随机的数据点,然后内部可以反......
  • halcon九点标定/手眼标定本源码用labview调用halcon九点标定算法以及labview我们自己
    halcon九点标定/手眼标定本源码用labview调用halcon九点标定算法以及labview我们自己总结halcon算法,写出的不用调用halcon的算法,结果一致。1.调用halcon实现九点标定2.labview自己算法写出的九点标定默认2选1这段话涉及到的知识点和领域范围包括:halcon九点标定算法、l......
  • 1595. 连通两组点的最小成本
    给你两组点,其中第一组中有size1个点,第二组中有size2个点,且size1>=size2。任意两点间的连接成本cost由大小为size1xsize2矩阵给出,其中cost[i][j]是第一组中的点i和第二组中的点j的连接成本。如果两个组中的每个点都与另一组中的一个或多个点连接,则称这两组点......
  • 西门子S7-1200 PLC双轴算法控制程序 西门子PLC做的电池焊接程序,
    西门子S7-1200PLC双轴算法控制程序西门子PLC做的电池焊接程序,电池包里面有n*m行列个电池,主要功能:1.每个电池的焊点坐标能够独立调整2.每个电池的焊接能量可独立选择3.任意一个或者多个电池可以随机选择不焊接4.可以选择某一边电池焊接5.可以灵活选择焊接方式6.可存储5套不同产品......
  • fpga svpwm算法 fpga svpw算法,矢量调制调制基于FPGA,具有过调制,同步调制,异步调制功能。
    fpgasvpwm算法fpgasvpw算法,矢量调制调制基于FPGA,具有过调制,同步调制,异步调制功能。带死区输出模块,主图为io口直接滤波后的效果。FPGA是一种可编程逻辑器件,可以用于实现各种数字电路功能。在这里,FPGA被用于实现矢量调制调制算法,即SVPWM算法。SVPWM算法是一种用于产生PWM信号的技......
  • 数据结构和算法系列课程(02) --- 线性表和贪吃蛇
    线性结构是一种具有以下特点的结构:存在唯一一个被称为“第一个”的数据元素存在唯一一个被称为“最后一个”的数据元素除第一个元素之外,集合中的每个元素均有且仅有一个前驱除最后一个元素之外,集合中的每个元素均有且仅有一个后继那么,线性表、栈、队列、数组、字符串都可以......
  • 数据结构和算法系列课程(01)--- 排序二叉树和红黑树
    把排序二叉树放在这个系列课程的第一个部分似乎有些唐突,但是考虑到它在面试中出现的可能性,把它放在这样的一个位置也就不足为奇了。关于树和二叉树的基础知识,可以到下面的链接中下载我的课件进行了解。下面给出一个排序二叉树的Java实现:packagcom.loonstudio;/***排序二叉树......
  • 步进电机T型算法基于stm32 步进电机T型运动控制器源码 输入脉冲数量 脉冲频率即可求出
    步进电机T型算法基于stm32步进电机T型运动控制器源码输入脉冲数量脉冲频率即可求出绝对位置相对位置,附带限位功能等。支持100khz。这段话涉及到的知识点和领域范围是步进电机控制、T型算法、STM32微控制器、脉冲数量、脉冲频率、绝对位置、相对位置和限位功能。步进电机是一......