如何使用数组计算总数和最小生成树

时间:2018-12-05 19:45:02

标签: c# count minimum-spanning-tree totals

我正在处理C#分配,其中必须通过使用数组来创建最小生成树。我的代码由三个数组组成,这些数组跟踪节点以及是否已到达节点。我必须找到要添加到访问所有节点的所有随机生成的链接的最小总数。但是,由于某种原因,它无法正常工作。产生的总数是不正确的,只是想知道是否有人可以帮助我找出原因。我相信误差一定是在计算总数或如何确定最小值之间,或者是我不确定。 >

到目前为止,我已经尝试更改涉及累加变量以分别存储值的计算方式。香港专业教育学院试图添加另一个if语句,将阻止最小值超过98(无效值为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();

0 个答案:

没有答案