Обьясните пожалуйста разницу
Задача: Проверить является ли заданный граф(неориентированный) регулярным(все вершины имеют одинаковую степень). В первую строку приходит количество графов 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 шт):
Я могу предположить причину ошибки при использовании 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 и отпишитесь, пройдут ли тесты успешно.