克魯斯卡爾算法輸出結果為何出現(xiàn)這樣的錯誤呢
如圖
這與老師的不太一樣啊
//克魯斯卡爾算法生成樹 void?CMap::kruskalTree()? ????{ ???? int?value=0;//取權值 int?edgeCount=0;//取出最小生成樹邊的個數(shù)? ???? //定義存放結點集合的數(shù)組?(數(shù)組的數(shù)組)? 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.根據(jù)點的所在集合的不同做出不同的處理 ??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() 這個函數(shù)里while()循環(huán)中第一個for()循環(huán)中的if()語句判斷 把 nodeAInSetLabel 換成?nodeAIsInSet
你這個地方寫錯了
2017-05-15
同問也是這個問題
2017-03-11
設置鄰接矩陣的時候出錯了吧