Я пытаюсь реализовать алгоритм обнаружения циклов в ориентированном графе (только исходящие соединения) с использованием JointJS. Я написал следующий код, который не работает должным образом.JointJs Cycle Detection
var _elements = graph.getElements();
var visited = [];
var level = 0;
var isCycleExists;
for (var i = 0; i < _elements.length; i++) {
var elem = _elements[i];
//only checking nodes which do have predecessors
if ((graph.getPredecessors(elem).length > 0) && !elem.isLink()
&& hasCycle(elem, visited, level)) {
isCycleExists = true;
break;
}
}
function hasCycle(comp, visited, level) {
var successors = graph.getSuccessors(comp);
visited.push(comp.id);
for (var i = 0; i < successors.length; i++) {
var c = successors[i];
var _successors = graph.getSuccessors(c);
if (_successors.length == 0) {
continue;
}
if (visited.indexOf(c.id) > -1) {
return true;
}
visited.push(c.id);
if (hasCycle(c, visited.slice(), ++level)) {
return true;
}
}
return false;
}
Было бы очень полезно, если бы кто-нибудь мог мне помочь в этом.
Так что, как ожидается, поведение и что реальное поведение, которое отличается от ожидаемого? Кроме того, вы получили '}' missing, это просто ошибка копирования или вы получили его в своем коде, и это вызывает ошибки? – YakovL
A -----> B ------> C ------> D ------> E: Это довольно линейная структура, но по-прежнему в соответствии с моей программой, это показывает, что он имеет цикл. Я также пробовал со многими другими структурами, которые на самом деле имели петли, и если я удаляю циклы из этих структур, он работает, но в вышеупомянутом случае использования это не удалось. The} - это просто ошибка копирования. Пожалуйста, проигнорируйте это. Для информации, я также пытался со следующим: A ----> B C -----> D -----> D C ------> B B ------> D D -------> B В этом случае мои программы показывают существование цикла в этой структуре графика. –