克鲁斯卡尔(Kruskal)
void Kruskal(MGraph g, int *sum, Road road[])
{ int i, j, a, b;
*sum = 0;
for(i = 0; i < g.n; i++)
v[i] = i;
sort(road,g.e);
for(i = 0; i < g.e; i++)
{
a = getRoot(road[i].a);
b = getRoot(road[i].b);
if(a != b)
{
v[a] = b;
*sum += road[i].w;
}
}
}
普里姆(Prim)
void Prim(MGraph g, int v0, int *sum)
{
int i, j, k;
int lowcost[maxSize],vset[maxSize], v, min;
*sum = 0;
for(i = 0; i < g.n; i++)
{
lowcost[i] = g.edges[v0][i];
vset[i] = 0;
}
vset[v0] = 1;
for(i = 0; i < g.n-1; i++)
{
min = Inf;
for(j = 0; j < g.n; j++)
if(vset[j] == 0 && lowcost[j] < min)
{
min = lowcost[j];
k = j;
}
vset[k] = 1;
*sum += min;
for(j = 0; j < g.n; j++)
if(vset[j] == 0 && g.edges[k][j] < lowcost[j])
lowcost[j] = g.edges[k][j];
}
}