Я изучал граф, и я закончил свою рекурсивную реализацию в C ++ для определения, когда граф имеет цикл или нет, вот мой код:
bool Graph::dfsCyclic(unsigned vt, bool *visited, bool *beingVisited) {
beingVisited[vt] = true;
bool dfs = false;
for (list<unsigned>::const_iterator it = this->adjList[vt].begin(); it!= this->adjList[vt].end(); ++it) {
if (beingVisited[*it]) {
return true;
}
if (!visited[*it]) {
dfs = this->dfsCyclic(*it, visited, beingVisited);
}
}
visited[vt] = true;
beingVisited[vt] = false;
return dfs;
}
bool Graph::isCyclic() {
bool visited[this->v];
bool beingVisited[this->v];
for (unsigned i = 0; i < this->v; ++i) {
visited[i] = false;
beingVisited[i] = false;
}
for (unsigned i = 0; i < this->v; ++i) {
if (dfsCyclic(i, visited, beingVisited)) {
return true;
}
}
return false;
}
Я хотел бы знать, думаете ли вы, ребята, если это хорошая реализация. Я сделал несколько тестов, и он работал нормально. Я также хотел бы знать, как я мог сделать и ИТЕРАЦИОННУЮ версию этого кода, я пробовал, но у меня есть некоторые проблемы с этим. Заранее спасибо за помощь! Также есть ли в любом случае, я могу доказать правильность этого кода?
Задача ещё не решена.
Других решений пока нет …