Я напишу здесь какой-то простой алгоритм, то, что вы делаете, это топологическая сортировка
Важно то, что топологическая сортировка использует алгоритм DFS O (V + E)
Что вам нужно сделать, это создать какой-то дополнительный атрибут для каждого узла (назовем его String color
и установите его начальное значение белым.
Поскольку вы будете перебирать узлы, установите его цвет на серый и продолжите делать DFS, после того, как это будет сделано, установите его цвет на черный.
Суть в том, что если вы посещаете узел с color == gray
или color == black
, вы нашли цикл
Я рекомендую прочитать главу Топологическая сортировка из Введение в алгоритмы
А давайте посмотрим ваш код!
Вы читаете что-то из входного файла, и важная часть здесь:
while (!list.isEmpty()) {
temp = list.pop();
counter++;
array.add(temp);
System.out.println("Time " + totalTime + "\t Started task " + temp.id + "\t Staff: " + temp.staff + ", Task done " + temp.id);
totalTime += temp.time;
for (Task t : ids) {
if (--t.cntPredecessors == 0) {
list.add(t);
}
}
}
извините за это, но ваш код немного запутан, без английской документации и т. Д., Но я думаю, что вам не хватает части окрашивания ваших узлов, что может быть причиной того, что вы не можете найти цикл (и я полагаю, что вы никогда не закончите), потому что вам не хватает «цвета» ваших узлов, поэтому никто не знает, что вы уже посетили их
кстати, мой атрибут "color" называется посещенным в вашем коде (вы можете использовать логическое значение, но тогда вы не можете закрасить его в серый / черный / белый, как в книге, которую я разместил здесь)
Я полагаю, вы установили значение true во время инициализации (вы должны установить значение false и установить значение true, если вы уже обработали / посетили узел)
// Извините, если я ошибаюсь, но сейчас 1 час ночи. здесь, я просто думаю, что это может быть проблемой
// + если вы сделаете это на ориентированном графе, и выйдете, если вы обнаружите цикл, вы получите и алгоритм обнаружения цикла за O (V) time:)