普利姆算法的輸出有問題,麻煩大家看看是哪里錯了,謝謝!
void CMap::primTree(int nodeIndex)
{
int value=0;
int edgeCount=0;?
vector<int> nodeVec;
vector<Edge> edgeVec;//備選邊的集合?
cout<<m_pNodeArray[nodeIndex].m_cData<<endl;
nodeVec.push_back(nodeIndex);
m_pNodeArray[nodeIndex].m_bIsVisited = true;
//
while(edgeCount<m_iCapacity-1)
{
int temp=nodeVec.back();//取出最尾部的元素
for(int i=0;i<m_iCapacity;i++)
{
getValueFromMatrix(temp,i,value);
if(value!=0)
{
if(m_pNodeArray[i].m_bIsVisited)
{
continue;
}
else
{
Edge edge(temp,i,value);
edgeVec.push_back(edge);
}
}
} //for循環做完就將與temp相關的所有邊放進edgeVec中?
//從可選邊集合中找出最小的邊?
int edgeIndex = getMinEdge(edgeVec);?
edgeVec[edgeIndex].m_bSelected = true;
cout<<edgeVec[edgeIndex].m_iNodeIndexA<<"--"<<edgeVec[edgeIndex].m_iNodeIndexB<<"? ";
cout<<edgeVec[edgeIndex].m_iWeightValue<<endl;
m_pEdge[edgeCount] = edgeVec[edgeIndex];
edgeCount++;
int nextNodeIndex = edgeVec[edgeIndex].m_iNodeIndexB;
nodeVec.push_back(nextNodeIndex);
m_pNodeArray[nextNodeIndex].m_bIsVisited=true;
cout<<m_pNodeArray[nextNodeIndex].m_cData<<endl;
}
}
int CMap::getMinEdge(vector<Edge>edgeVec)
{
int minWeight=0;
int edgeIndex=0;
int i=0;
for(;i<edgeVec.size();i++)
{
if(!edgeVec[i].m_bSelected)
{
minWeight = edgeVec[i].m_iWeightValue;
edgeIndex =i;
break;?
}
}
if(minWeight==0)//當前edgeVec中的所有邊已經被訪問?
{
return -1;
}
for(;i<edgeVec.size();i++)
{
if(edgeVec[i].m_bSelected)
{
continue;
}
else
{
if(minWeight>edgeVec[i].m_iWeightValue)
{
minWeight=edgeVec[i].m_iWeightValue;
? ? edgeIndex = i;
}
}
}
return edgeIndex;
}
2018-07-22
這里應該是把nextnodeindex放進去 函數是nodevc.back(nextnodeindex) 你手誤了 那樣是放不進去的 這樣的話 下一次還從A找 所以就錯了