Обьясните пожалуйста разницу

Задача: Проверить является ли заданный граф(неориентированный) регулярным(все вершины имеют одинаковую степень). В первую строку приходит количество графов K. В вторую количество вершин N и ребер M. Дальше M строк по 2 числа - описание ребер. В конце программа должна выводить YES или NO. Так вот у меня есть 2 кода. Мой:

    using System;


namespace ConsoleApp26
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int k = int.Parse(Console.ReadLine());
            string res = "";
            for (int i = 0; i < k; i++)
            {
                int[] nm = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
                int[] degres = new int[nm[0]];
                for (int j = 0; j < nm[1]; j++)
                {
                    int[] temp = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
                    degres[temp[0] - 1]++;
                    degres[temp[1] - 1]++;
                }
                if (RegularGraf(degres))
                {
                    res += "YES\n";
                }
                else
                {
                    res += "NO\n";
                }
            }
            Console.WriteLine(res);

        }

        static bool RegularGraf(int[] degres)
        {
            for (int i = 0; i < degres.Length; i++)
            {
                if (degres[i] != degres[0])
                {
                    return false;
                }
            }
            return true;
        }

    }
}

и ГПТшный:

using System;

class Program
{
    static void Main()
    {
        int k = int.Parse(Console.ReadLine());
        string res = "";
        for (int i = 0; i < k; i++)
        {
            string[] nm = Console.ReadLine().Split();
            int n = int.Parse(nm[0]);
            int m = int.Parse(nm[1]);
            int[] degrees = new int[n];
            for (int j = 0; j < m; j++)
            {
                string[] edge = Console.ReadLine().Split();
                int u = int.Parse(edge[0]) - 1;
                int v = int.Parse(edge[1]) - 1;
                degrees[u]++;
                degrees[v]++;
            }
            bool isRegular = true;
            for (int j = 0; j < n; j++)
            {
                if (degrees[j] != degrees[0])
                {
                    isRegular = false;
                    break;
                }
            }
            res += isRegular ? "YES\n" : "NO\n";
        }
        Console.WriteLine(res);
    }
}

Разницы вроде никакой нет. Натыкал что когда пишу Array.ConvertAll(Console.ReadLine().Split(), int.Parse);, то не проходит какой-то 1 тест(посмотреть не могу). Почему так происходит?

using System;


namespace ConsoleApp26
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int k = int.Parse(Console.ReadLine());
            string res = "";
            for (int i = 0; i < k; i++)
            {
                string[] nm = Console.ReadLine().Split();
                int n = int.Parse(nm[0]);
                int m = int.Parse(nm[1]);
                int[] degres = new int[n];
                for (int j = 0; j < m; j++)
                {
                    string[] temp = Console.ReadLine().Split();
                    degres[int.Parse(temp[0]) - 1]++;
                    degres[int.Parse(temp[1]) - 1]++;
                }
                if (RegularGraf(degres))
                {
                    res += "YES\n";
                }
                else
                {
                    res += "NO\n";
                }
            }
            Console.WriteLine(res);

        }

        static bool RegularGraf(int[] degres)
        {
            for (int i = 0; i < degres.Length; i++)
            {
                if (degres[i] != degres[0])
                {
                    return false;
                }
            }
            return true;
        }

    }
}

Поменял

int[] nm = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);

И

 int[] temp = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
 degres[temp[0] - 1]++;
 degres[temp[1] - 1]++;

На

string[] nm = Console.ReadLine().Split();
int n = int.Parse(nm[0]);
int m = int.Parse(nm[1]);

И

string[] temp = Console.ReadLine().Split();
degres[int.Parse(temp[0]) - 1]++;
degres[int.Parse(temp[1]) - 1]++;

И все работает так что не так с Array.ConvertAll(Console.ReadLine().Split(), int.Parse);


Ответы (1 шт):

Автор решения: Alexander Petrov

Я могу предположить причину ошибки при использовании Array.ConvertAll.
Вероятно, на вход подаётся строка с пробелом в конце.

Допустим, на вход подана строка 4 5 - тогда Console.ReadLine().Split() вернёт массив из двух строк.
А если на вход подать строку 4 5 - тогда Split() вернёт массив из трёх строк. Последняя - пустая. При этом ConvertAll все три попытается распарсить в int и на последней строке будет ошибка.


Метод Split имеет несколько перегрузок и может принимать параметр count, ограничивающий количество элементов в итоговом массиве.

Console.WriteLine("4 5".Split().Length); // 2
Console.WriteLine("4 5 ".Split().Length); // 3
Console.WriteLine("4 5 ".Split(' ', 2).Length); // 2

Попробуйте указать этот параметр при использовании Array.ConvertAll и отпишитесь, пройдут ли тесты успешно.

→ Ссылка