克鲁斯卡尔算法输出结果为何出现这样的错误呢
如图

这与老师的不太一样啊
//克鲁斯卡尔算法生成树
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 minEdgeIndex=getMinEdge(edgeVec);
edgeVec[minEdgeIndex].m_bSelected=true;
//3.找到最小边连接的点
int nodeAIndex=edgeVec[minEdgeIndex].m_iNodeIndexA;
int nodeBIndex=edgeVec[minEdgeIndex].m_iNodeIndexB;
bool nodeAIsInSet=false;
bool nodeBIsInSet=false;
int nodeAInSetLabel=-1;
int nodeBInSetLabel=-1;
//4.找出点所在的点的集合
for(int i=0;i<nodeSets.size();i++)
{
nodeAIsInSet=isInSet(nodeSets[i],nodeAIndex);
if(nodeAInSetLabel)
{
nodeAInSetLabel=i;
}
}
for(int i=0;i<nodeSets.size();i++)
{
nodeBIsInSet=isInSet(nodeSets[i],nodeBIndex);
if(nodeBIsInSet)
{
nodeBInSetLabel=i;
}
}
//5.根据点的所在集合的不同做出不同的处理
if(nodeAInSetLabel==-1&&nodeBInSetLabel==-1)
{
vector<int>vec;
vec.push_back(nodeAIndex);
vec.push_back(nodeBIndex);
nodeSets.push_back(vec);
}
else if(nodeAInSetLabel==-1&&nodeBInSetLabel!=-1)
{
nodeSets[nodeBInSetLabel].push_back(nodeAIndex);
}
else if(nodeAInSetLabel!=-1&&nodeBInSetLabel==-1)
{
nodeSets[nodeAInSetLabel].push_back(nodeBIndex);
}
else if(nodeAInSetLabel!=-1&&nodeBInSetLabel!=-1&&nodeAInSetLabel!=nodeBInSetLabel)
{
mergeNodeSet(nodeSets[nodeAInSetLabel],nodeSets[nodeBInSetLabel]);//合并两个集合
for(int k=nodeBInSetLabel;k<(int)nodeSets.size()-1;k++)//删除队列中元素
{
nodeSets[k]=nodeSets[k+1];
}
}
else if(nodeAInSetLabel!=-1&&nodeBInSetLabel!=-1&&nodeAInSetLabel==nodeBInSetLabel)//两个点中同一个集合即形式回路
{
continue;
}
m_pEdge[edgeCount]=edgeVec[minEdgeIndex];
edgeCount++;
cout<<edgeVec[minEdgeIndex].m_iNodeIndexA<<"---"<<edgeVec[minEdgeIndex].m_iNodeIndexB<<" ";
cout<<edgeVec[minEdgeIndex].m_iWeightValue<<endl;
}
}
bool CMap::isInSet(vector<int> nodeSet,int target)
{
for(int i=0;i<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]);
}
}