(图)最小生成树(普利姆算法)

本文深入探讨了普利姆算法在构建图的最小生成树过程中的应用,详细介绍了三个关键步骤:1.从初始点开始选择点集合;2.在待选边中寻找最小边;3.不断更新待选边集合直至构建完整最小生成树。通过实例解析,帮助读者理解算法原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.点集合(根据第一个点找出下一个点)
2.最小边集合(从待选边中找出最小边)
3.待选边集合

//普利姆算法
void Cmap::primTree(int nodeIndex)
{
    int value = 0;
    int edgeCount = 0; //最小边数目
    vector<int> nodeVec;//存放结点
    vector<Edge> edgeVec;//存放与该点相连接的所有边(即待选边集合)

    nodeVec.push_back(nodeIndex);
    m_pNodeArray[nodeIndex].m_bIsVisited = true; //将当前结点置为TRUE,下次不再访问
    cout << m_pNodeArray[nodeIndex].m_cData << " ";
    while (edgeCount < m_iCapacity - 1)
    {
        int temp = nodeVec.back();

        for (int i = 0; i < m_iCapacity; i++)
        {
            getValueFromMatrix(temp, i, value);
            if (value != 0)
            {
                if (m_pNodeArray[i].m_bIsVisited)
                {
                    continue;
                }
                else
                {
                    Edge edge(temp, i, value);
                    edgeVec.push_back(edge);//存放所有与结点temp相连接的边
                }
            }
        }
        //从待选边中找出权值最小的边
        int edgeIndex = getMinEdge(edgeVec);
        cout << edgeVec[edgeIndex].m_iNodeIndexA << " " << edgeVec[edgeIndex].m_iNodeIndexB << " " << edgeVec[edgeIndex].m_iWeightValue << endl;
        edgeVec[edgeIndex].m_bSelected = true;
        m_pEdge[edgeCount] = edgeVec[edgeIndex];//将最小边存放至数组m_pEdge中

        edgeCount++;
        int nextNodeIndex = edgeVec[edgeIndex].m_iNodeIndexB;
        nodeVec.push_back(nextNodeIndex);
        m_pNodeArray[nextNodeIndex].m_bIsVisited = true;
        cout << m_pNodeArray[nextNodeIndex].m_cData << endl;
    }
}

int Cmap::getMinEdge(vector<Edge>edgeVec)
{
    int minWeight = 0;
    int edgeIndex = 0;

    int i = 0;
    for (; i < edgeVec.size(); i++)
    {
        if (!edgeVec[i].m_bSelected)
        {
            minWeight = edgeVec[i].m_iWeightValue;
            //m_pNodeArray[]
            edgeIndex = i;
            break;
        }
    }
    if (minWeight == 0)
    {
        return -1;
    }
    for (; i < edgeVec.size(); i++)
    {
        if (edgeVec[i].m_bSelected)
        {
            continue;
        }
        else
        {
            if (edgeVec[i].m_iWeightValue < minWeight)
            {
                minWeight = edgeVec[i].m_iWeightValue;
                edgeIndex = i;

            }
        }
    }
    return edgeIndex;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值