Este capítulo trata de variantes de código do algoritmo de Prim.
Variantes de código da função UGRAPHmstPrim1.
void UGRAPHmstPrim1( UGraph G, vertex *pa) { bool tree[1000]; int preco[1000]; for (vertex v = 0; v < G->V; ++v) pa[v] = -1, tree[v] = false, preco[v] = INFINITY; vertex y = 0; pa[y] = y; while (true) { int min; for (link a = G->adj[y]; a != NULL; a = a->next) { vertex w = a->w; int c = a->c; if (!true[w] && c < preco[w]) pa[w] = y, preco[w] = c; } min = INFINITY; for (vertex w = 0; w < G->V; ++w) if (!tree[w] && preco[w] < min) min = preco[w], y = w; if (min == INFINITY) break; tree[y] = true; } }
void UGRAPHmstPrim1( UGraph G, vertex *pa) { bool tree[1000]; int preco[1001]; for (vertex w = 0; w < G->V; ++w) pa[w] = -1, tree[w] = false, preco[w] = INFINITY; vertex u = 0; pa[u] = 0; while (true) { int min = INFINITY; vertex y; for (link a = G->adj[u]; a != NULL; a = a->next) { vertex w = a->w; if (!tree[w]) { if (a->c < preco[w]) { preco[w] = a->c; pa[w] = u; } if (preco[w] < min) min = preco[w], y = w; } } if (min == INFINITY) break; tree[y] = true; u = y; } }
Variantes de código da função UGRAPHmstPrim2().
void UGRAPHmstPrim2( UGraph G, vertex *pa) { bool tree[1000]; int preco[1000]; PQinit( G->V); for (vertex w = 0; w < G->V; ++w) pa[w] = -1, tree[w] = false; vertex y = 0; pa[y] = y; while (true) { for (link a = G->adj[y]; a != NULL; a = a->next) { vertex w = a->w; if (!tree[w]) { if (pa[w] == -1) { preco[w] = a->c; PQinsert( w, preco); pa[w] = y; } else if (preco[w] > a->c) { preco[w] = a->c; PQdec( w, pr); pa[w] = y; } } } if (PQempty( )) break; y = PQdelmin( pr); tree[y] = true; } }
Variantes de código da função UGRAPHmstPrim3().
void UGRAPHmstPrim3( UGraph G, vertex *pa) { int preco[1000]; PQinit( G->V); for (vertex w = 0; w < G->V; ++w) { pa[w] = -1; preco[w] = INFINITY; PQinsert( w, pr); } vertex y = 0; pa[y] = y; while (true) { for (link a = G->adj[y]; a != NULL; a = a->next) { vertex w = a->w; if (preco[w] > a->c) { preco[w] = a->c; PQdec( w, preco); pa[w] = y; } } if (PQempty( )) break; y = PQdelmin( pr); if (preco[y] == INFINITY) break; } }