Would FindShortestTour be a better choice, (if I have read this correctly) as an example
AbsoluteTiming[SeedRandom[1]; pts = RandomReal[100, {100, 2}];
pair = Partition[pts[[Last[FindShortestTour[pts]]]], 2];
Print[Graphics[{Line[pair], Red, PointSize[.015], Point[pts]}]];
Total[Table[
Sqrt[(pair[[q, 1, 1]] - pair[[q, 2, 1]])^2 + (pair[[q, 1, 2]] -
pair[[q, 2, 2]])^2], {q, 1, Length[pair]}]]]
or by rotating the points by 1 to get the other possible set of pairs
AbsoluteTiming[SeedRandom[1]; pts = RandomReal[100, {100, 2}];
pair = Partition[pts[[Last[FindShortestTour[pts]]]], 2];
pair = Partition[RotateLeft[Flatten[pair, 1]], 2];
Print[Graphics[{Line[pair], Red, PointSize[.015], Point[pts]}]];
Total[Table[
Sqrt[(pair[[q, 1, 1]] - pair[[q, 2, 1]])^2 + (pair[[q, 1, 2]] -
pair[[q, 2, 2]])^2], {q, 1, Length[pair]}]]]
in comparison to this method
AbsoluteTiming[SeedRandom[1]; pts = RandomReal[100, {100, 2}];
g = CompleteGraph[Length[pts]];
verGraph = VertexReplace[g, Thread[VertexList[g] -> pts]];
weighGraph =
Graph[verGraph,
EdgeWeight -> EuclideanDistance @@@ EdgeList[verGraph]];
pair = Partition[FindHamiltonianPath[weighGraph], 2];
Print[Graphics[{Line[pair], Red, PointSize[.015], Point[pts]}]];
Total[Table[
Sqrt[(pair[[q, 1, 1]] - pair[[q, 2, 1]])^2 + (pair[[q, 1, 2]] -
pair[[q, 2, 2]])^2], {q, 1, Length[pair]}]]]
The shortest tour option is also much faster, 3000 points is under a second on my machine.