Exemplo n.º 1
0
        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);
            }
        }