第一步取出所有边
第二步从所有边中取出组成最小生成树的
1.找到算法结束条件
2.从边集合中取出最小边
3.找出最小边连接到的点
4.找出点所在的点集合
5.根据所在集合的不同做出不同的处理
//克鲁斯卡尔算法生成树
void Cmap::kruskalTree()
{
int value = 0;
int edgeCount = 0;//计数(最小边集合中边的数目)
//存放结点集合的数组
vector<vector<int>>nodeSets;
vector<Edge> edgeVec;//存放所有边的集合
//第一步取出所有边
for (int i = 0; i < m_iCapacity; i++)
{
for (int k = i + 1; k < m_iCapacity; k++)
{
getValueFromMatrix(i, k, value);
if (value != 0)
{
Edge edge(i, k, value);
edgeVec.push_back(edge);
}
}
}
//从所有边中取出组成最小生成树的边
//1.找到算法结束条件
while (edgeCount < m_iCapacity - 1)
{
//2.从边集合中取出最小边
int minEdge = getMinEdge(edgeVec);
edgeVec[minEdge].m_bSelected = true;
//找出最小边连接到的点
int nodeAIndex = edgeVec[minEdge].m_iNodeIndexA;
int nodeBIndex = edgeVec[minEdge].m_iNodeIndexB;
bool nodeAIsInSet = false;
bool nodeBIsInSet = false;
int nodeAIndexLabel = -1;
int nodeBIndexLabel = -1;
//4.找出点所在的点集合
for (int i = 0; i < (int)nodeSets.size(); i++)
{
nodeAIsInSet=isInSet(nodeSets[i], nodeAIndex);
if (nodeAIsInSet)
{
nodeAIndexLabel = i;
}
}
for (int i = 0; i < (int)nodeSets.size(); i++)
{
nodeBIsInSet = isInSet(nodeSets[i], nodeBIndex);
if (nodeBIsInSet)
{
nodeBIndexLabel = i;
}
}
//5.根据所在集合的不同做出不同的处理
if (nodeAIndexLabel == -1 && nodeBIndexLabel == -1)
{//创建新的点集合
vector<int> vec;
vec.push_back(nodeAIndex);
vec.push_back(nodeBIndex);
nodeSets.push_back(vec);
}
else if (nodeAIndexLabel != -1 && nodeBIndexLabel == -1)
{
nodeSets[nodeAIndexLabel].push_back(nodeBIndex);
}
else if (nodeAIndexLabel == -1 && nodeBIndexLabel != -1)
{
nodeSets[nodeBIndexLabel].push_back(nodeAIndex);
}
else if (nodeAIndexLabel != -1 && nodeBIndexLabel != -1&&nodeAIndexLabel!=nodeBIndexLabel)
{
mergeNodeSet(nodeSets[nodeAIndexLabel], nodeSets[nodeBIndexLabel]); //合并两个点集合至A
for (int i = nodeBIndexLabel; i < (int)nodeSets.size()-1; i++)
{
nodeSets[i] = nodeSets[i + 1];
}
}
//A B两点在同一个点集中 形成回路,则把该边去除
else if (nodeAIndexLabel != -1 && nodeBIndexLabel != -1 && nodeAIndexLabel == nodeBIndexLabel)
{
continue;//进行下一次循环
}
m_pEdge[edgeCount] = edgeVec[minEdge];
edgeCount++;
cout << edgeVec[minEdge].m_iNodeIndexA << "---" << edgeVec[minEdge].m_iNodeIndexB << " " << edgeVec[minEdge].m_iWeightValue << endl;
}
}
bool Cmap::isInSet(vector<int>nodeSet, int target)
{
for (int i = 0; i < (int)nodeSet.size(); i++)
{
if (nodeSet[i] == target)
{
return true;
}
}
return false;
}
void Cmap::mergeNodeSet(vector<int>&nodeSetA, vector<int>nodeSetB)
{
for (int i = 0; i < (int)nodeSetB.size(); i++)
{
nodeSetA.push_back(nodeSetB[i]);
}
}