#include<iostream>
#include<string>
using namespace std;
//普里姆算法求最小生成树:先取一点,然后求其周围各点最近的,将其纳入最小生成树里面,再在生成最小生成树周围求最近的,之后再纳入,这样不断遍历每个节点
void MiniSpanTree_Prim(MGraph G)
{
int adjvex[MAXVEX];
int lowcost[MAXVEX];
lowcost[0] = 0;
adjvex[0] = 0;
for (int i = 1; i < G.numVertexes; i++)//初始化
{
lowcost[i] = G.arc[0][i];//保存相关顶点间的权值,为0的在最小生成树里面,不为0的即最小生成树周围的权值
adjvex[i] = 0;//保存相关顶点下标
}
for (int i = 1; i < G.numVertexes; i++)
{
int min = INFINITY;
int k;
for (int j = 1; j < G.numVertexes; j++)//求最小生成树周围的最小权值
{
if (lowcost[j] != 0 && min>lowcost[j])
{
min = lowcost[j];
k = j;
}
}
cout << adjvex[k] <<' '<< k << endl;//打印刚纳入最小生成树的节点
lowcost[k] = 0;
for (int j = 1; j < G.numVertexes; j++)//对最小生成树周围的权值进行更新(因为新加入了新的节点k入最小生成树了)
{
if (lowcost[j] != 0 && G.arc[k][j] < lowcost[j])
{
lowcost[j] = G.arc[k][j];
adjvex[j] = k;
}
}
}
}