예제 #1
0
        /// <summary>
        /// Tìm cây khung nhỏ nhất theo thuật toán Kruskal
        /// </summary>
        /// <param name="a">Mảng chứa danh sách kề</param>
        /// <param name="n">Số đỉnh</param>
        static void Kruskal(int[,] a, int n)
        {
            EdgeCollection list = matrix_edge_convert(a, n);

            list.Sort();
            EdgeCollection listResult = new EdgeCollection();

            //danh dau nhan i cho dinh i
            int[] label = new int[n];
            for (int i = 0; i < n; i++)
            {
                label[i] = i;
            }
            int lab1 = 0;
            int lab2 = 0;

            foreach (Edge item in list)
            {
                if (label[item.start.Index] != label[item.end.Index])
                {
                    listResult.Add(item);
                    if (label[item.start.Index] > label[item.end.Index])
                    {
                        lab1 = label[item.end.Index];
                        lab2 = label[item.start.Index];
                    }
                    else
                    {
                        lab2 = label[item.end.Index];
                        lab1 = label[item.start.Index];
                    }
                    for (int i = 0; i < n; i++)
                    {
                        if (label[i] == lab2)
                        {
                            label[i] = lab1;
                        }
                    }
                }
            }
            foreach (Edge item in listResult)
            {
                Console.WriteLine(item.ToString());
            }
        }
예제 #2
0
        /// <summary>
        /// Tìm cây khung nhỏ nhất theo thuật toán Krukal
        /// </summary>
        public EdgeCollection Kruskal()
        {
            Reset();
            EdgeCollection listResult = new EdgeCollection();

            _edgeList.Sort();
            //danh dau nhan i cho dinh i
            int[] label = new int[n];
            for (int i = 0; i < n; i++)
            {
                label[i] = i;
            }
            int lab1 = 0;
            int lab2 = 0;

            foreach (Edge item in _edgeList)
            {
                if (label[item.start.Index] != label[item.end.Index])
                {
                    listResult.Add(item);
                    if (label[item.start.Index] > label[item.end.Index])
                    {
                        lab1 = label[item.end.Index];
                        lab2 = label[item.start.Index];
                    }
                    else
                    {
                        lab2 = label[item.end.Index];
                        lab1 = label[item.start.Index];
                    }
                    for (int i = 0; i < n; i++)
                    {
                        if (label[i] == lab2)
                        {
                            label[i] = lab1;
                        }
                    }
                }
            }
            return(listResult);
        }