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

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

Kruscal最小生成树算法


算法主体程序

void MyMap::kruscalTree(){    int weightValue = 0;    int edgeCount = 0;    vector<Edge> edgeVec;    vector<vector<int>> nodeVecSet;    //找出所有边添加到一个集合    for (int i = 0;i < m_iCapacity;i++)    {        for (int j = i + 1;j < m_iCapacity;j++)        {            getValueFromMatrix(i, j, weightValue);            if (weightValue != 0)            {                Edge edge(i, j, weightValue);                edgeVec.push_back(edge);            }        }    }    while (edgeCount < m_iCapacity - 1)    {           int nodeIndexA = 0;        int nodeIndexB = 0;        //找出最小边,将其与其顶点保存        int minEdgeIndex = getMinWeightEdge(edgeVec);        edgeVec[minEdgeIndex].m_bIsSelected = true;        //找到最小边的顶点        nodeIndexA = edgeVec[minEdgeIndex].m_iNodeIndexA;        nodeIndexB = edgeVec[minEdgeIndex].m_iNodeIndexB;        //查看是否已在顶点集合的数组中,并记录其所在顶点集在数组中的索引        int vecIndexA = -1;             int vecIndexB = -1;        for (int i = 0; i < (int)nodeVecSet.size(); i++)        {            //找到A所在的顶点集合在数组中的索引            if (isNodeInVec(nodeVecSet[i], nodeIndexA))            {                vecIndexA = i;            }            //找到B所在的顶点集合在数组中的索引            if (isNodeInVec(nodeVecSet[i], nodeIndexB))            {                vecIndexB = i;            }        }        //顶点未添加时,新建集合并将其顶点添加至集合中,集合添加至集合数组中        if (vecIndexA == -1 && vecIndexB == -1)        {            vector<int> nodeVec;            nodeVec.push_back(nodeIndexA);            nodeVec.push_back(nodeIndexB);            nodeVecSet.push_back(nodeVec);        }        //A已在集合中,而B不在,将B添加至A所在的集合        if (vecIndexA != -1 && vecIndexB == -1)        {            nodeVecSet[vecIndexA].push_back(nodeIndexB);        }        //B已在集合中,而A不在,将A添加至B所在的集合        if (vecIndexA == -1 && vecIndexB != -1)        {            nodeVecSet[vecIndexB].push_back(nodeIndexA);        }        //A,B已添加但在两个集合中,将这两个集合合并        if (vecIndexA != -1 && vecIndexB != -1 && vecIndexA != vecIndexB)        {            mergeVecInSet(nodeVecSet[vecIndexA], nodeVecSet[vecIndexB]);            for (int k = vecIndexB;k < (int)nodeVecSet.size() - 1;k++)            {                nodeVecSet[k] = nodeVecSet[k + 1];            }        }        if (vecIndexA != -1 && vecIndexB != -1 && vecIndexA == vecIndexB)        {            continue;        }        //最小边保存至最小边集合,并标为已选择        m_pEdge[edgeCount] = edgeVec[minEdgeIndex];        cout << edgeVec[minEdgeIndex].m_iNodeIndexA << "-----" << edgeVec[minEdgeIndex].m_iNodeIndexB<<" : ";        cout << edgeVec[minEdgeIndex].m_iWeight << endl;        edgeCount++;    }}

判断节点是否已添加的程序

bool MyMap::isNodeInVec(vector<int> nodeVec, int nodeIndex){    for (int i = 0;i <(int) nodeVec.size();i++)    {        if (nodeIndex == nodeVec[i])        {            return true;        }    }    return false;}

合并顶点集合的程序

void MyMap::mergeVecInSet(vector<int> &nodeVecA, vector<int> nodeVecB){    for (int i = 0; i < (int)nodeVecB.size();i++)    {        nodeVecA.push_back(nodeVecB[i]);    }}
0 0
原创粉丝点击