Prim最小生成树算法(C++)

来源:互联网 发布:hough变换算法 编辑:程序博客网 时间:2024/06/05 23:48

Prim最小生成树算法


算法主体程序

void MyMap::primTree(int nodeIndex){    vector<int>  nodeVec;    vector<Edge> edgeVec;    //将第一个顶点添加至顶点集合    nodeVec.push_back(nodeIndex);           cout << m_pNodeArray[nodeIndex].m_cData << endl;    m_pNodeArray[nodeIndex].m_bIsVisited = true;    int tempNodeIndex = 0;    int m_iEdgeCount = 0;    int weightValue = 0;    int minEdgeIndex = 0;    //查找与当前节点相邻的边,将其添加至候选边集合    while (m_iEdgeCount < m_iCapacity-1)    {        //取出当前顶点        tempNodeIndex = nodeVec.back();        //遍历查找当前顶点的相邻节点        for (int i = 0;i < m_iCapacity;i++)        {            getValueFromMatrix(tempNodeIndex, i, weightValue);            if (weightValue != 0)            {                if(m_pNodeArray[i].m_bIsVisited)                {                    //与已访问过的节点之间的边不添加, 因为已经添加了                    continue;                }                Edge edge(tempNodeIndex, i, weightValue);                edgeVec.push_back(edge);            }        }        //找出候选边集合中权重最小的边,程序在下边        minEdgeIndex = getMinWeightEdge(edgeVec);        cout << edgeVec[minEdgeIndex].m_iNodeIndexA << "------" << edgeVec[minEdgeIndex].m_iNodeIndexB << "  ";        cout << edgeVec[minEdgeIndex].m_iWeight << endl;        edgeVec[minEdgeIndex].m_bIsSelected = true;        //将该边添加至权重最小边集合        m_pEdge[m_iEdgeCount] = edgeVec[minEdgeIndex];        m_iEdgeCount++;        //顶点更新为最小边所连的那个顶点        tempNodeIndex = edgeVec[minEdgeIndex].m_iNodeIndexB;        m_pNodeArray[tempNodeIndex].m_bIsVisited = true;        cout << m_pNodeArray[tempNodeIndex].m_cData << endl;        nodeVec.push_back(tempNodeIndex);    }}

权重最小边查找程序

int MyMap::getMinWeightEdge(vector<Edge> edgeVec){    int minEdgeIndex = 0;    int minEdgeWeight = 0;    int i = 0;    int k, l = 0;    //找到第一条还未选择过的边    for (;i < (int)edgeVec.size();i++)    {        if (!edgeVec[i].m_bIsSelected)        {            minEdgeWeight = edgeVec[i].m_iWeight;            minEdgeIndex = i;            break;        }    }    if (minEdgeWeight == 0)    {        return -1;    }    //找最小权重边的索引    for (i;i <(int) edgeVec.size();i++)    {        if (edgeVec[i].m_bIsSelected)        {            continue;        }        k = edgeVec[i].m_iNodeIndexA;        l = edgeVec[i].m_iNodeIndexB;        if (minEdgeWeight > edgeVec[i].m_iWeight)        {            if (m_pNodeArray[k].m_bIsVisited && m_pNodeArray[l].m_bIsVisited)            {                //避免出现最小生成树产生环路                continue;            }            minEdgeWeight = edgeVec[i].m_iWeight;            minEdgeIndex = i;        }    }    return minEdgeIndex;}
0 0