最小生成树之普利姆算法:
void CMap::primTree(int nodeIndex)
{
int value = 0;
int edgeCount = 0;
vectornodeVec;
vectoredgeVec;
nodeVec.push_back(nodeIndex);
cout << m_pNodeArray[nodeIndex].m_cData << endl;
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)
{
Edge edge(temp, i, value);
edgeVec.push_back(edge);
}
}
else
{
continue;
}
}
int min = getMinEdge(edgeVec);
cout << edgeVec[min].m_iNodeIndexA << " " << edgeVec[min].m_iNodeIndexB<<" ";
cout << edgeVec[min].m_iWeightValue << endl;
m_pEdge[edgeCount] = edgeVec[min];
edgeVec[min].m_bSelected = true;
edgeCount++;
int nextNodeIndex = edgeVec[min].m_iNodeIndexB;
nodeVec.push_back(nextNodeIndex);
cout << m_pNodeArray[nextNodeIndex].m_cData << endl;
m_pNodeArray[nextNodeIndex].m_bIsVisited = true;
}
}
int CMap::getMinEdge(vectoredgeVec)
{
int minWeight = 0;
int edgeIndex = 0;
int i = 0;
for (; i < (int)edgeVec.size(); i++)
{
if (!edgeVec[i].m_bSelected)
{
minWeight = edgeVec[i].m_iWeightValue;
edgeIndex = i;
break;
}
}
if (minWeight == 0)
{
return -1;
}
for (; i < (int)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;
}