ZBLOG

最小生成树之克鲁斯卡尔(Kruskal)算法编程 提示如下: 在矩阵中以上排序操作不方便编程,所以定义下面结构体存储边的信息。 typedef struct { int begin; // 边的起点 int end; // 边的终点 int weight; // 边的权重 bool selected; // 是否作为最小生成树的边,初值flase }Edge; // 定...

这是一个使用克鲁斯卡尔算法求最小生成树的示例代码。你可以根据提示将其编写成完整的程序。

#include <iostream>
#include <algorithm>

const int MAXVEX = 100;  // 最大顶点数
const int MAXEDGE = 100; // 最大边数

typedef struct
{
    int begin;      // 边的起点
    int end;        // 边的终点
    int weight;     // 边的权重
    bool selected;  // 是否作为最小生成树的边,初值false
} Edge;

int parent[MAXVEX];     // 用于寻找根节点的数组,初始化为 -1
Edge edges[MAXEDGE];    // 定义存储边的数组

// 找到顶点v所在树的根节点(递归实现)
int Find(int v)
{
    if (parent[v] == -1)
        return v;
    else
        return Find(parent[v]);
}

// 按照边的权重进行排序(从小到大)
bool Compare(const Edge& a, const Edge& b)
{
    return a.weight < b.weight;
}

void Kruskal(int vertexNum, int edgeNum)
{
    for (int i = 0; i < vertexNum - 1; i++)
    {
        for (int j = i + 1; j < vertexNum - 1; j++)
        {
            std::cin >> edges[edgeNum].begin >> edges[edgeNum].end >> edges[edgeNum].weight;
            edges[edgeNum].selected = false;
        }
    }

    std::sort(edges, edges + edgeNum, Compare); // 对边数组进行排序

    for (int i = 0; i < edgeNum; i++)
    {
        int n = Find(edges[i].begin);   // 找边的起点的根
        int m = Find(edges[i].end);     // 找边的终点的根

        // 两个顶点不在一棵子树内
        if (n != m)
        {
            parent[m] = n;
            edges[i].selected = true;
        }
    }

    // 输出所有选中的边
    for (int i = 0; i < edgeNum; i++)
    {
        if (edges[i].selected)
            std::cout << edges[i].begin << " - " << edges[i].end << " : " << edges[i].weight << std::endl;
    }
}

int main()
{
    int vertexNum, edgeNum;

    std::cin >> vertexNum >> edgeNum;

    Kruskal(vertexNum, edgeNum);

    return 0;
}

你可以根据具体需要修改输入输出方式和调用部分来适应你自己的环境。注意,该代码只是一个示例,可能需要根据实际情况进行适当的修改和优化。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=10194

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?