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]);
}
}