как рассчитать итоговые и минимальные остовные деревья, используя массивы - PullRequest
0 голосов
/ 05 декабря 2018

Я работаю над заданием на C #, в котором мне нужно создать минимальное связующее дерево с помощью массивов.Мой код состоит из трех массивов, которые отслеживают узлы и определяют, были ли они достигнуты.Я должен найти наименьшее общее количество для всех случайно сгенерированных ссылок, которые будут добавлены, чтобы посетить все узлы.Однако по какой-то причине это не совсем работает.Получаемые итоги не верны, и мне просто интересно, может ли кто-нибудь помочь мне разобраться, почему. Я считаю, что ошибка должна быть между вычислением итога или тем, как определяется минимальное значение или возможно обоими, как бы я не был уверен.

До сих пор я пытался изменить способ вычисления, чтобы задействовать переменную суммы для отдельного хранения значений.Я попытался добавить еще один оператор if, который не позволил бы значению min превышать 98 (значение void равно 99). Я также попытался изменить предыдущий код, чтобы убедиться, что тестирование значений в массиве SP является желательным.из них.до сих пор нет результатов

            int n = 5;              //n = number of values
        int m = 50;             //m = max value in arra
        int VoidValue = 99;     // if i = j value = void value
        int Total = 0;          //Total value for spanning tree
        int sum = 0;        //Sum for total value for spanning tree

        Random Rand = new Random(); //Create randomise value


        int[,] c = new int[n + 1, n + 1]; //Cost array

        int[] SP = new int[n + 1];      //Spanned array

        int[,] AD = new int[n + 1, n + 1];  //Adjacency array

        for (int i = 1; i <= n; i++)
        {
            SP[i] = 0;
            for (int j = 1; j <= n; j++)
            {

                if (i == j)
                {
                    c[i, j] = VoidValue;               // give void spaces the value of 99
                    AD[i, j] = 0;
                }
                else
                {
                    c[i, j] = Rand.Next(1, m);    // Populate the array with randomised values
                    AD[i, j] = 0;
                }
            }
        }

        //Output all arrays to screen

        Console.WriteLine("Cost Array: At the beginning");
        Console.WriteLine("");
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (i == j)
                {
                    Console.Write("c[" + i + "," + j + "] = " + "- " + " ");
                }
                else
                {
                    Console.Write("c[" + i + "," + j + "] = " + c[i, j].ToString("00") + " ");
                }
            }
            Console.WriteLine();
        }
        Console.ReadLine();

        Console.WriteLine("");
        Console.WriteLine("Spanned Array : At the beginning");
        Console.WriteLine("");
        for (int i = 1; i <= n; i++)
        {
            Console.Write("S[" + i + "] = " + SP[i].ToString("00") + " ");
            Console.WriteLine();
        }
        Console.ReadLine();

        Console.WriteLine("");
        Console.WriteLine("Adjacency Array : At the beginning");
        Console.WriteLine("");
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (i == j)
                {
                    Console.Write("A[" + i + "," + j + "] = " + "- " + " ");
                }
                else
                {
                    Console.Write("A[" + i + "," + j + "] = " + AD[i, j].ToString("00") + " ");
                }
            }
            Console.WriteLine();
        }
        Console.ReadLine();

        // Random Starting Point

        int startPoint = Rand.Next(1, n + 1);
        Console.WriteLine("Start at node " + startPoint);
        SP[startPoint] = 1;

        //Check the spanned array 
        Console.WriteLine("");
        Console.WriteLine("Spanned Array : After the starting point has been chosen ");
        Console.WriteLine("");
        for (int i = 1; i <= n; i++)
        {
            Console.Write("S[" + i + "] = " + SP[i].ToString("00") + " ");
            Console.WriteLine();
        }
        Console.ReadLine();

        // Find minimum vallue link, repeatedly follow these links until spanned array is full

        for (int p = 1; p < n; p++) // For every value of the spanned array 
        {
            int MinValue = VoidValue, MinValuei = 0, MinValuej = 0; // declare variables
            for (int i = 1; i <= n; i++)
            {
                for (int j = 1; j <= n; j++)        // I and J are for both variables of the cost and adjacent array
                    if (i != j)
                    {
                        if (SP[i] == 1)             //Spanned node
                        {
                            if (SP[j] == 0)         //Unspanned node
                            {
                                if (c[i, j] < MinValue)
                                {

                                  MinValue = c[i, j];
                                  MinValuei = i;
                                  MinValuej = j;

                                }
                            }
                        }
                    }
                AD[MinValuei, MinValuej] = 1;
                SP[MinValuej] = 1;
            }

            Console.WriteLine("");
            Console.WriteLine("The min value is: " + MinValue);
            Total = Total + MinValue;
            Console.WriteLine("");
            Console.WriteLine("The total is: " + Total);
        }
        //Finally output spanned and adjacent arrays 

        Console.WriteLine("");
        Console.WriteLine("Spanned Array: After spanning tree");
        Console.WriteLine("");
        for (int i = 1; i <= n; i++)
        {
            Console.Write("S[" + i + "] = " + SP[i].ToString("00") + " ");
            Console.WriteLine();
        }
        Console.ReadLine();

        Console.WriteLine("");
        Console.WriteLine("Adjacency Array : After spanning tree");
        Console.WriteLine("");
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (i == j)
                {
                    Console.Write("A[" + i + "," + j + "] = " + "- " + " ");
                }
                else
                {
                    Console.Write("A[" + i + "," + j + "] = " + AD[i, j].ToString("00") + " ");
                }

            }
            Console.WriteLine();
        }
        Console.ReadLine();

        //Output total value for the spanning tree

        Console.WriteLine("");
        Console.WriteLine("The total value for the spanning tree: " + Total);
        Console.WriteLine("");
        Console.ReadLine();
...