1.点集合(根据第一个点找出下一个点)
2.最小边集合(从待选边中找出最小边)
3.待选边集合
//普利姆算法
void Cmap::primTree(int nodeIndex)
{
int value = 0;
int edgeCount = 0; //最小边数目
vector<int> nodeVec;//存放结点
vector<Edge> edgeVec;//存放与该点相连接的所有边(即待选边集合)
nodeVec.push_back(nodeIndex);
m_pNodeArray[nodeIndex].m_bIsVisited = true; //将当前结点置为TRUE,下次不再访问
cout << m_pNodeArray[nodeIndex].m_cData << " ";
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);//存放所有与结点temp相连接的边
}
}
}
//从待选边中找出权值最小的边
int edgeIndex = getMinEdge(edgeVec);
cout << edgeVec[edgeIndex].m_iNodeIndexA << " " << edgeVec[edgeIndex].m_iNodeIndexB << " " << edgeVec[edgeIndex].m_iWeightValue << endl;
edgeVec[edgeIndex].m_bSelected = true;
m_pEdge[edgeCount] = edgeVec[edgeIndex];//将最小边存放至数组m_pEdge中
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;
//m_pNodeArray[]
edgeIndex = i;
break;
}
}
if (minWeight == 0)
{
return -1;
}
for (; i < edgeVec.size(); i++)
{
if (edgeVec[i].m_bSelected)
{
continue;
}
else
{
if (edgeVec[i].m_iWeightValue < minWeight)
{
minWeight = edgeVec[i].m_iWeightValue;
edgeIndex = i;
}
}
}
return edgeIndex;
}