>231
やっぱ分かりにくかったか。すまん。
とりあえず、dist[i][j] が i 番目の点と j 番目の点の距離、
table[i] は i 番目の点を選択した後、次の点を選択する際の順序ってのはいい?

>l47:bool operator()(int a, int b) { return table[a] < table[b]; }
これは sort に渡すための関数オブジェクト。qsort でも比較関数渡すよね?
sort の第 3 引数に渡すことで、operator < の代わりに要素の比較に使われる。
a と b の比較をする場合に、table[a] と table[b] の比較を行うことになる。
table 自体はコンストラクタで渡してるものを使う。

>l63:sort(table[i].begin(), table[i].end(), ValueCompare<Dists>(dist[i]));
ValueCompare<Dists>(dist[i]) は一時関数オブジェクトの生成。
↑の関数オブジェクトで比較を行う際の table に dist[i] を使うことを指定。
結果、dist[i][a] と dist[i][b] の比較、つまり i 番目の点からの距離の大小で
ソートを行うことになる。
NNUM = 5, i = 3 とすると table[i] は { 1, 2, 4 } と点の番号が並ぶ vector に
なってる。
sort の結果が { 2, 1, 4 } となった場合、3番目の点に一番近いのが 2 番目の点。
以下、1 番目、4 番目と続くのでこの順で選択を試す。(>227 の 3, 4)

>l61:table[i].push_back(j);
>l87:context.results.push_back(context.temp);
何が分からないのかよく分からないけど、末尾挿入自体に大した意味はないよ。
別に、添え字を使ってアクセスして代入したところで違いはない。
ただそれだと現在の要素数を管理する必要があるんで、それが面倒だったから。
| for(int j = 1; j < NNUM; j++) if(i != j) table[i].push_back(j);
と
| int k = 0;
| for(int j = 1; j < NNUM; j++) if(i != j) table[i][k++] = j;
の違い。
l87 の方だと context.results のサイズが足りるかどうかも気にしなきゃならなくなる。