為什么克魯斯卡爾算法輸出會(huì)這樣呢
下面是我看著老師的視頻寫的代碼,我看了好幾遍,沒(méi)發(fā)現(xiàn)有什么不同,但是就是出錯(cuò),不知道什么原因。
同樣的代碼,普力馬算法就正常
void?CMap::kruskalTree() { int?value?=?0; int?edgeCount?=?0; //定義存放結(jié)點(diǎn)集合的數(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); } } } //第二步:從所有邊中取出組成最小生成樹(shù)的邊 //1.找到算法結(jié)束條件 while?(edgeCount?<?m_iCapacity?-?1) { //2.從邊集合中找到最小邊 int?minEdgeIndex?=?getMinEdge(edgeVec); edgeVec[minEdgeIndex].m_bSelected?=?true; //3.找出最小邊連接的點(diǎn) 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.找出點(diǎn)所在的點(diǎn)集合 for?(int?i?=?0;?i?<?(int)nodeSets.size();?i++) { nodeAIsInSet?=?isInSet(nodeSets[i],?nodeAIndex); if?(nodeAIsInSet) { nodeAInSetLabel?=?i; } } for?(int?i?=?0;?i?<?(int)nodeSets.size();?i++) { nodeBIsInSet?=?isInSet(nodeSets[i],?nodeBIndex); if?(nodeBIsInSet) { nodeBInSetLabel?=?i; } } //5.根據(jù)點(diǎn)所在集合的不同做出不同的處理 if?(nodeAInSetLabel?==?-1?&&?nodeBInSetLabel?==?-1) { vector<int>?vec; vec.push_back(nodeAIndex); vec.push_back(nodeBIndex); nodeSets.push_back(vec); } if?(nodeAInSetLabel?==?-1?&&?nodeBInSetLabel?!=?-1) { nodeSets[nodeBInSetLabel].push_back(nodeAIndex); } if?(nodeAInSetLabel?!=?-1?&&?nodeBInSetLabel?==?-1) { nodeSets[nodeBInSetLabel].push_back(nodeBIndex); } 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]; } } 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?<?(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]?); } }
2017-06-09
從報(bào)錯(cuò)信息上看是容器下標(biāo)越界的意思就是說(shuō)你容器的區(qū)間傳入了錯(cuò)誤的值或大或小。
隨后檢查了代碼在75行處nodeSets[nodeBInSetLabel].push_back(nodeBIndex);下標(biāo)處應(yīng)該是nodeAInSetLabel 修改看看可否解決問(wèn)題。