public List <DrawPoint> Find() { var pointGroups = inner.GroupBy(point => point.X).OrderBy(g => g.Key).Select(g => g.OrderBy(point => point.Y)); if (string.CompareOrdinal(start.X, finish.X) > 0) { pointGroups = pointGroups.Reverse(); } var res = new List <DrawPoint>(inner.Count + 2) { start }; foreach (var group in pointGroups) { var g = group.ToList(); if (g.Count == 1) { res.Add(g.First()); continue; } if (DrawPoint.GetDistance(res.Last(), g.First()) > DrawPoint.GetDistance(res.Last(), g.Last())) { g.Reverse(); } res.AddRange(g); } res.Add(finish); return(res); }
private int[] GetTree() { var dist = new int[VertexCount]; var parent = new int[VertexCount]; var used = new bool[VertexCount]; parent[0] = int.MaxValue; for (var i = 1; i < dist.Length; ++i) { dist[i] = int.MaxValue; parent[i] = int.MaxValue; } for (var t = 0; t < VertexCount; ++t) { var current = 0; for (var i = 0; i < VertexCount; ++i) { if (used[current] || !used[i] && dist[current] > dist[i]) { current = i; } } used[current] = true; for (var i = 0; i < VertexCount; ++i) { if (used[i]) { continue; } var d = DrawPoint.GetDistance(GetPoint(current), GetPoint(i)); if (d < dist[i]) { dist[i] = d; parent[i] = current; } } } return(parent); }