public static void PrimAlg(int numberV, List <MyTuple> e, List <MyTuple> mst) { var notUsedE = new List <MyTuple>(e); var usedV = new List <int>(); var notUsedV = new List <int>(); for (var i = 0; i < numberV; i++) { notUsedV.Add(i); } var addAndRemove = new Work((v) => { usedV.Add(v); notUsedV.Remove(v); }); var isEdge = new CheckEdge((u, v) => usedV.IndexOf(u) != -1 && notUsedV.IndexOf(v) != -1); addAndRemove(0); while (notUsedV.Count > 0) { var min = -1; for (var i = 0; i < notUsedE.Count; i++) { var curEdge = notUsedE[i]; if (isEdge(curEdge.Item1, curEdge.Item2) || isEdge(curEdge.Item2, curEdge.Item1)) { min = min == -1 ? i : curEdge.Item3 < notUsedE[min].Item3 ? i : min; } } var curMinE = notUsedE[min]; addAndRemove(usedV.IndexOf(curMinE.Item1) != -1 ? curMinE.Item2 : curMinE.Item1); mst.Add(curMinE); notUsedE.RemoveAt(min); } }