учитывая график, чтобы определить, является ли он деревом или нет в направленных и неориентированных графах?
Я хотел бы знать быстрый алгоритм, чтобы определить, является ли данный граф деревом или нет. этой post, похоже, имеет дело с этим, но не очень ясно. По этому, если граф ациклический, то это дерево. если вы рассмотрите примеры направленного и неориентированного графа, на мой взгляд, только 1 и 4 являются деревом, но 3 не является ни циклическим, ни деревом, я полагаю.
Итак, мой вопрос: что нужно проверить, чтобы увидеть, является ли график деревом или нет для обоих направленный и неориентированный граф эффективным образом?
делая один шаг вперед, чтобы увидеть, если существует дерево-это двоичное дерево или нет?
1 ответов
для ориентированного графа:
найти вершину только с исходящими ребрами (если таких вершин больше одной или нет, не удается).
сделайте BFS или DFS из этой вершины. Если вы столкнулись с уже посещенной вершиной, это не дерево.
Если вы закончили и есть неисследованные вершины, это не дерево - граф не связан.
в противном случае, это дерево.
чтобы проверить наличие двоичного дерева, дополнительно проверьте, имеет ли каждая вершина не более 2 исходящих ребер.
для неориентированного графа:
Проверьте цикл с простым поиском глубины (начиная с любой вершины) - " если неисследованное ребро ведет к узлу, посещенному ранее, то график содержит цикл." если есть цикл, это не дерево.
Если выше процесс оставляет некоторые вершины неисследованными, это не дерево, потому что оно не связано.
в противном случае, это дерево.
-
чтобы проверить наличие двоичного дерева, дополнительно проверьте, что все вершины имеют 1-3 ребра (один для родителя и 2 для детей).
проверка корня, т. е. содержит ли одна вершина 1-2 ребра, не нужна, так как там до быть вершинами с 1-2 ребрами в ациклическом Связном неориентированном диаграмма.
обратите внимание, что идентификация корня в общем случае невозможна (это может быть возможно в особых случаях), поскольку во многих неориентированных графах более одного узла можно сделать корнем, если мы сделаем его двоичным деревом.