克魯斯卡爾算法輸出結果為何出現這樣的錯誤呢
如圖

這與老師的不太一樣啊
//克魯斯卡爾算法生成樹
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]);
}
}
2017-06-06
kruskalTree() 這個函數里while()循環中第一個for()循環中的if()語句判斷 把 nodeAInSetLabel 換成?nodeAIsInSet
你這個地方寫錯了
2017-05-15
同問也是這個問題
2017-03-11
設置鄰接矩陣的時候出錯了吧