Проблема с С# List при компиляции в моно (домашнее задание)

Я признаю, что это моя домашняя работа. В заявлении задачи сказано, что я должен написать программу, которая находит топологический порядок графика, который будет вводиться стандартным вводом. Затем мне нужно отправить его на класс профессора.

Теперь это не проблема алгоритма. Это скорее техническая проблема. В моем компьютере я использую компилятор .NET(csc), в то время как машина оценки профессора использует некоторую форму моно.

Это хорошо работает, пока грейдер не сказал, что я получил 30/100. Один из моих друзей предложил использовать грейдерную "систему ввода вручную", поэтому я пошел, я создал списки массивов из 100000 для списка смежности.

Грейдер спустя несколько секунд сообщил, что моя программа потерпела крах.

Stacktrace:

at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke_object__this__ (object,intptr,intptr,intptr) <0xffffffff>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_object_new_fast (intptr) <0xffffffff>
at System.Exception.ToString () <0x00026>
at (wrapper runtime-invoke) object.runtime_invoke

Это странно и тревожно для меня, но мне еще предстоит найти ответ. Опять же, эта программа отлично работала на моем ПК.

Это моя часть программы:

using System;
using System.Collections;
using System.Collections.Generic;

class topo{
public static void Main(){
    string[] ST = Console.ReadLine().Split(' ');
    int N=Convert.ToInt32(ST[0]), M=Convert.ToInt32(ST[1]);
    int[] ins = new int[N];  //node total in-degrees
    List<int>[] E = new List<int>[N];

    for(int n=0;n<N;n++)    
        E[n] = new List<int>();

    for(int m=0;m<M;m++){
        ST = Console.ReadLine().Split(' ');
        int u = Convert.ToInt32(ST[0]);
        int v = Convert.ToInt32(ST[1]);
        E[u-1].Add(v-1);
        ins[v-1]++;
    }

    Queue S = new Queue();
    List<int> L = new List<int>(); //result list

    for(int n=0;n<N;n++){
        //add stranded nodes directly and don't process it
        if(ins[n]==0 && E[n].Count==0)
            L.Add(n);

        //put into queue
        else if(ins[n]==0)
            S.Enqueue(n);
    }

    while(S.Count>0){
        int n = (int) S.Dequeue();
        L.Add(n);
        foreach(int m in E[n])
            if(--ins[m]==0)
                S.Enqueue(m);
    }

    foreach(int n in L)
        Console.WriteLine(n+1);

}

}

Большое спасибо, и я ценю любой ответ.

Изменить: я еще раз взглянул на выход грейдера, чтобы увидеть, пропустил ли я что-нибудь, и действительно сделал. Он сказал "syscal: 2", но все, что я знаю об этом, это то, что "программа не выходила нормально".

Изменить № 2: я попытался сделать попытку программы сделать различные размеры массива списка, начиная от 5000, 10000 и т.д., а после 40000 "система ручного ввода" заявила, что программа получила Систему .OutOfMemoryException. С дальнейшим изучением различных частей грейдера, которым разрешены студенты, кажется, что проф неправильно сконфигурировал его параметры сортировки и дал нам меньше памяти, чем было объявлено. (Он сказал "32 МБ", но программа вылетает около 16 МБ)

Я сообщил ему об ошибке, и он (прямо сейчас) изучает его.

Ответ 1

Следующий код будет сбой, если значение u или v меньше 1.

for(int m=0;m<M;m++){
    ST = Console.ReadLine().Split(' ');
    int u = Convert.ToInt32(ST[0]);
    int v = Convert.ToInt32(ST[1]);
    E[u-1].Add(v-1);
    ins[v-1]++;
}

Потому что u-1 или v-1 будет отрицательным, и это вызовет исключение.

Ответ 2

Последующее наблюдение: это анекдотично, самонадеянно и очень поздно, потому что я просто понял, что все в порядке отвечать самому себе. Позднее меня уведомили, что я преодолел ограничение на память, установленное системой классификации. Однако исключение было довольно загадочным в моем случае, и грейдер не сообщил об этой проблеме. (Он отметил меня только как неправильный.)

Я также был совершенно невнимателен, чтобы не осознавать, что работают меньшие материалы, и почему я получил 30/100, а не ноль.

Для будущих читателей: при программировании в среде автоматического грейдера, пожалуйста, убедитесь, что ваша программа не переместила ограничение по памяти, которое может быть там, но может не быть вам известно (т.е. не написано в описании проблемы).