Напишите функцию, которая возвращает true, если заданный неориентированный граф является деревом, и false в противном случае. Например, следующий график является деревом.
Но следующий граф не является деревом.
Ненаправленный граф является деревом, если он имеет следующие свойства. 1) Цикла нет. 2) График связан.
Для неориентированного графа мы можем использовать BFS или DFS, чтобы обнаружить два вышеуказанных свойства.
Как обнаружить цикл в неориентированном графе? Мы можем использовать BFS или DFS. Для каждой посещенной вершины v, если есть соседняя u, такая, что u уже посещена, и u не является родителем v, то в графе есть цикл. Если мы не найдем такого смежного объекта для какой-либо вершины, мы говорим, что цикла нет (см. Цикл «Обнаружение цикла» для более подробной информации).
Как проверить подключение? Поскольку граф не является ненаправленным, мы можем запустить BFS или DFS из любой вершины и проверить, все ли вершины достижимы или нет. Если все вершины достижимы, то граф связен, иначе нет.
C ++
// Программа на C ++ для проверки, является ли граф древовидным или нет #include<iostream> #include <list> #include <limits.h>
usingnamespacestd;
// Класс для неориентированного графа
classGraph
{
intV; // Количество вершин
list<int> *adj; // Указатель на массив для списков смежности
boolisCyclicUtil(intv, boolvisited[], intparent);
public:
Graph(intV); // Конструктор
voidaddEdge(intv, intw); // добавить ребро на график
boolisTree(); // возвращает true, если граф является деревом
};
Graph::Graph(intV)
{
this->V = V;
adj = newlist<int>[V];
}
voidGraph::addEdge(intv, intw)
{
adj[v].push_back(w); // Добавить w в список v.
adj[w].push_back(v); // Добавить v в список w.
}
// Рекурсивная функция, которая использует visit [] и parent для // обнаружение цикла в подграфе, достижимом из вершины v.
// Повторение для всех вершин, смежных с этой вершиной
Iterator<Integer> it = adj[v].iterator();
while(it.hasNext())
{
i = it.next();
// Если соседний не посещен, то повторять
// это смежно
if(!visited[i])
{
if(isCyclicUtil(i, visited, v))
returntrue;
}
// Если соседний посещен и не является родителем
// текущая вершина, то есть цикл.
elseif(i != parent)
returntrue;
}
returnfalse;
}
// Возвращает true, если граф является деревом, иначе false.
Boolean isTree()
{
// Пометить все вершины как не посещенные и не как части
// рекурсивного стека
Boolean visited[] = newBoolean[V];
for(inti = 0; i < V; i++)
visited[i] = false;
// Вызов isCyclicUtil служит нескольким целям
// Возвращает true, если граф достижим из вершины 0
// цикличен Он также отмечает все доступные вершины
// с 0.
if(isCyclicUtil(0, visited, -1))
returnfalse;
// Если мы найдем вершину, которая недостижима от 0
// (не помечено isCyclicUtil (), тогда мы возвращаем false
for(intu = 0; u < V; u++)
if(!visited[u])
returnfalse;
returntrue;
}
// Метод драйвера
publicstaticvoidmain(String args[])
{
// Создать график, приведенный на диаграмме выше
Graph g1 = newGraph(5);
g1.addEdge(1, 0);
g1.addEdge(0, 2);
g1.addEdge(0, 3);
g1.addEdge(3, 4);
if(g1.isTree())
System.out.println("Graph is Tree");
else
System.out.println("Graph is not Tree");
Graph g2 = newGraph(5);
g2.addEdge(1, 0);
g2.addEdge(0, 2);
g2.addEdge(2, 1);
g2.addEdge(0, 3);
g2.addEdge(3, 4);
if(g2.isTree())
System.out.println("Graph is Tree");
else
System.out.println("Graph is not Tree");
}
} // Этот код предоставлен Aakash Hasija
питон
# Программа Python для проверки # граф дерево или нет
fromcollections importdefaultdict
classGraph():
def__init__(self, V):
self.V =V
self.graph =defaultdict(list)
defaddEdge(self, v, w):
# Добавить w к v ist.
self.graph[v].append(w)
# Добавить v в список w.
self.graph[w].append(v)
# Рекурсивная функция, которая использует посещения []
# и родитель для определения цикла в подграфе
# достижимо из вершины v.
defisCyclicUtil(self, v, visited, parent):
# Пометить текущий узел как посещенный
visited[v] =True
# Повторить для всех смежных вершин
# для этой вершины
fori inself.graph[v]:
# Если соседний не посещен,
# затем повторить для этого смежного
ifvisited[i] ==False:
ifself.isCyclicUtil(i, visited, v) ==True:
returnTrue
# Если соседний посещен, а не
# родитель текущей вершины, то есть
# это цикл.
elifi !=parent:
returnTrue
returnFalse
# Возвращает true, если граф является деревом,
# еще ложь.
defisTree(self):
# Отметить все вершины как не посещенные
# а не часть стека рекурсии
visited =[False] *self.V
# Вызов isCyclicUtil обслуживает несколько
# цели. Возвращает true, если график достижим
# из вершины 0 цикличен. Это также отмечает
# все вершины достижимы от 0.
ifself.isCyclicUtil(0, visited, -1) ==True:
returnFalse
# Если мы найдем вершину, которая недоступна
# из 0 (не помечено isCyclicUtil (),
# тогда мы возвращаем false
fori inrange(self.V):
ifvisited[i] ==False:
returnFalse
returnTrue
# Драйверная программа для проверки вышеуказанных функций
g1 =Graph(5)
g1.addEdge(1, 0)
g1.addEdge(0, 2)
g1.addEdge(0, 3)
g1.addEdge(3, 4)
print"Graph is a Tree"ifg1.isTree() ==True\
else"Graph is a not a Tree"
g2 =Graph(5)
g2.addEdge(1, 0)
g2.addEdge(0, 2)
g2.addEdge(2, 1)
g2.addEdge(0, 3)
g2.addEdge(3, 4)
print"Graph is a Tree"ifg2.isTree() ==True\
else"Graph is a not a Tree"
# Этот код предоставлен Divyanshu Mehta
Выход:
Graph is Tree
Graph is not Tree
Спасибо Vinit Verma за предложение этой проблемы и первоначальное решение. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме