history

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;
}