Jedná se o kostru grafu. Stačí přidávat hrany od nejkratších, vynechat jen ty, které by způsobily cyklus.
/* Find minimum spanning tree */ int min_tree(void) { int i, j, k, dist, to; for (i = 0; i < n; i++) for (j = 0; j < n; j++) { dist = 0; for (k = 0; k < 7; k++) dist += codes[i][k] != codes[j][k]; d[i][j] = dist; } for (i = 1; i <= CODELEN; i++) en[i] = 0; for (i = 0; i < n; i++) cp[i].l = CODELEN+1; dist = 0; memset(got, 0, n); eout[0][en[0]++] = 0; cp[0].p = cp[0].l = 0; while (1) { for (i = 0; i <= CODELEN && !en[i]; i++); if (i > CODELEN) return dist; to = eout[i][0]; remove_arr(i, 0); got[to] = 1; dist += i; for (i = 0; i < n; i++) if (!got[i] && cp[i].l > d[to][i]) { eout[d[to][i]][en[d[to][i]]++] = i; if (cp[i].l < CODELEN+1) remove_arr(cp[i].l, cp[i].p); cp[i].l = d[to][i]; cp[i].p = en[d[to][i]]-1; } } return 0; }