主要思想:
以顶点为主线,构成生成树。把图的顶点分成两类,一类是生成树中的点(类A),另一类是图余下的点(类B)。从与类A中的点相邻接的,属于类B的点中,选择权值最小的边,把它加入到生成树中,直到图中所有顶点被加入类A。
int Prim(Graph g)
{
int sum = 0, v;
int vset[Max];
info lowcost[Max];//保存最小生成树的顶点是谁拉进来的
int i;
//init
for(i = 0 ; i < Max ; i++)
{
vset[i] = 0;
}
for(i = 1 ; i <= g->n ; i++)
{
lowcost[i].data = g->table[1][i];
lowcost[i].from = 1;
}
vset[1] = 1;
//main
for(i = 1 ; i <= g->n-1 ; i++)
{
int k , min = Max , p = 0;
//find min weight & position
for(k = 1 ; k <= g->n ; k++)
{
if(lowcost[k].data < min && vset[k] == 0)
{
min = lowcost[k].data;
p = k;
}
}
//add
sum += min;
//update lowcost array
v = p;
for(k = 1 ; k <= g->n ; k++)
{
if(vset[k] == 0 && g->table[v][k] < lowcost[k].data)
{
lowcost[k].data = g->table[v][k];
lowcost[k].from = v;
}
}
vset[v] = 1;
}
return sum;
}