既然给出了prim的,就顺便写一下Kruskal的伪代码描述:
struct Edge{
int u, v, w; //u for starting point, v for end point, w for weight
Edge(int u, int v, int w){
this->u = u;
this->v = v;
this->w = w;
}
Edge(int u, int v){
this->u = u;
this->v = v;
}
Edge(){}
~Edge(){}
};
bool cmp(Edge edge1, Edge edge2){
return edge1.w < edge2.w;
}
void Kruskal(Graph* G){
ParPtrTree A(G->n());
Edge edge[G->n];
int eid = 0; //edge's id starts from 0 to (G->n - 1)
for(int i = 0 ; i < G->n() ; i++){
for(int w = G->first(i) ; w < G->n() ; w = G->next(i, w)){
edge[eid].u = i;
edge[eid].v = v;
edge[eid++].w = w;
}
} // load data from adjacency list to edge array
qsort(edge, edge + G->n(), cmp);
int vertices = G->n();
for(int i = 0 ; i < G->n() && vertices > 1 ; i++){
if(A.differ(edge[i].u, edge[i].v)){
A.UNION(v, u);
addEdgetoMST(edge[i].u, edge[i].v);
vertices--;
}
}
}