Другой способ - использовать модифицированную версию алгоритма Поиск в ширину . Попробуйте представить себе простой график, треугольник. Начните с любой вершины с BFS и сохраните, кто является родительским узлом и расстояние от корня.
Всякий раз, когда вы сталкиваетесь с уже посещенной (но не законченной вершиной), которую вы можете простым серым цветом, вы должны проверить расстояние и родителя.
B Start BFS from A: node A has dist=0, parent=Null
/ \ node B has dist=1, parent=A
/ \ node C has dist=1, parent=A
A - - C
Например, вы сейчас находитесь на C, B его уже посетили, и A закончил (черный), теперь вы проверяете соседний с C, вы видите B и проверяете, одинаковое ли расстояние и есть ли у вас один и тот же родитель, если это правда, вы нашли треугольник, если нет, вы столкнулись с циклом, но не с треугольником.
Это будет лучше, чем O(n^2)
Сложность этого алгоритма (BFS) заключается в количестве вершин + количество ребер: O(|V| + |E|)
.