- Выберите граф который является деревом
- Является ли граф деревом в прологе?
- Ответы 1
- Прямой ответ на ваш вопрос
- Комментарии к вашему коду
- Определить или граф есть деревом
- 2 Ответ от cmd 2011-04-03 00:56:33
- 3 Ответ от Acmefan 2011-04-03 20:13:55
- 4 Ответ от rauf 2011-05-08 13:07:22
- Определить, является ли неориентированный graph деревом (ациклический связный graph)
- Является ли граф деревом
- Является ли граф деревом
- Решение
Выберите граф который является деревом
Докажите, что граф, в котором любые две вершины соединены ровно одним простым путем, является деревом.
Очевидно, что данный граф связен. Предположим теперь, что в нем есть цикл. Тогда любые две вершины этого цикла соединены по крайней мере двумя простыми путями. Получили противоречие, значит, наше предположение неверно.
Докажите, что в дереве любые две вершины соединены ровно одним простым путем.
Предположим противное и рассмотрим те две вершины, которые соединены двумя разными простыми путями. На первый взгляд кажется, что пройдя от одной вершины к другой по первому пути, и вернувшись по второму, мы получим цикл. К сожалению, это не совсем так. Дело в том, что первый и второй пути могут иметь общие вершины (кроме начала и конца), а по определению цикла вершины в нем не должны повторяться. Для того, чтобы выделить настоящий цикл из уже полученного нужно сделать следующее:
1) выбрать первую точку, в которой пути расходятся
2) за выбранной точкой на пути 1 найти первую точку, принадлежащую также и пути 2
Теперь участки первого и второго пути между точками A и B образуют простой цикл.
Докажите, что в дереве есть вершина, из которой выходит ровно одно ребро (такая вершина называется висячей).
Рассмотрим произвольную вершину дерева и пойдем по любому выходящему из нее ребру в другую вершину. Если из новой вершины больше ребер не выходит, то мы остаемся в ней, а в противном случае идем по любому другому ребру дальше. Понятно, что в этом путешествии мы никогда не сможем попасть в вершину, в которой уже побывали: это означало бы наличие цикла. Так как у графа конечное число вершин, то наше путешествие обязательно должно закончиться. Но закончиться оно может только в висячей вершине!
В графе все вершины имеют степень 3. Докажите, что в нем есть цикл.
Рассмотрим произвольную компоненту связности этого графа. Она не является деревом, так как в ней нет висячей вершины. Значит, в ней есть цикл.
Докажите, что при удалении любого ребра из дерева оно превращается в несвязный граф.
Предположим, что концы удаленного ребра в новом графе соединены простым путем. Тогда этот путь вместе с удаленным ребром образует в исходном графе цикл.
В стране Древляндия 101 город, и некоторые из них соединены дорогами. При этом любые два города соединяет ровно один путь. Сколько в этой стране дорог?
Из условия задачи следует, что граф дорог Древляндии – дерево. У этого дерева есть висячая вершина. Удалим ее вместе с ребром, которое из нее выходит. Оставшийся граф также является деревом. Поэтому у него есть висячая вершина, которую мы также удалим вместе с выходящим из нее ребром. Проделав эту операцию 100 раз, мы получим граф, состоящий из одной вершины (в котором, конечно, нет ребер). Поскольку каждый раз удалялось ровно одно ребро, то сначала их было 100.
Докажите, что связный граф, у которого число ребер на единицу меньше числа вершин, является деревом.
Если нет, то удалением нескольких ребер из него можно получить дерево.
Волейбольная сетка имеет вид прямоугольника размером 50 × 600 клеток. Какое наибольшее число веревочек можно перерезать так, чтобы сетка не распалась на куски?
Будем рассматривать волейбольную сетку как граф, вершинами которого являются узлы сетки, а ребрами – веревочки. В этом графе нужно удалить как можно больше ребер так, чтобы он остался связным. Будем убирать ребра по очереди до тех пор, пока это возможно. Заметим, что если в графе есть цикл, то возможно удаление любого ребра этого цикла. Связный граф, не имеющий циклов, является деревом. Поэтому, только получив дерево, мы не сможем убрать ни одного ребра. Подсчитаем число ребер в нашем графе в этот момент. Количество вершин осталось тем же – 51 • 601 = 30651. Число ребер в дереве на 1 меньше числа вершин и, следовательно, в нашем дереве будет 30650 ребер. Сначала же их было 601 • 50 + 600 • 51 = 60650. Таким образом, можно удалить 30000 ребер, то есть у волейбольной сетки можно перерезать 30000 веревочек (но не более!).
В некоторой стране 30 городов, причем каждый соединен с каждым дорогой. Какое наибольшее число дорог можно закрыть на ремонт так, чтобы из каждого города можно было проехать в каждый?
Докажите, что в любом связном графе можно удалить вершину вместе со всеми выходящими из нее ребрами так, чтобы он остался связным.
Выделите максимальное дерево и удалите его висячую вершину.
В стране 100 городов, некоторые из которых соединены авиалиниями. Известно, что от любого города можно долететь до любого другого (возможно, с пересадками). Докажите, что можно побывать в каждом городе, совершив не более а) 198 перелетов; б) 196 перелетов.
а), б) Рассмотрите «максимальное» дерево и выберите путь, соединяющий две висячие вершины.
Является ли граф деревом в прологе?
Я изучаю Пролог, и у меня есть этот код, который должен определить, является ли граф деревом. Граф является деревом, если нет цикла и ребра соединены.
Мой вопрос: как я могу получить решение?
Например, для этого графика?
График = [a-b, b-c, b-d, c-d] Я пытаюсь понять, как это работает.
Ответы 1
Прямой ответ на ваш вопрос
Вы спросили, как проверить, является ли граф деревом в Прологе, специально для вашего примера графа:
Структура графа закодирована в атомах node и edge .
Правило path основано на этом этот пример.
Правила connected , hascycle и tree соответствуют правилам из вашей программы.
Обратите внимание, что идентификаторы в верхнем регистре — это переменные: Graph — переменная, а graph1 — константа.
Комментарии к вашему коду
Есть несколько проблем с кодом, который вы дали:
Он не компилируется с SWI Prolog 8.0.1. Мне пришлось заменить использование not A без скобок на not(A) . Кроме того, мне пришлось заменить использование формы not(A,B) на not((A,B)) . Если ваша программа компилируется для вас, укажите, какой компилятор/интерпретатор Prolog вы используете.
Ваш код не содержит определения path , обратитесь к примеру, указанному выше.
Ваш код содержит дополнительное правило stree , предположительно проверяющее, является ли Tree остовное дерево Graph , с вспомогательными правилами cover и subset .
Определение subset полностью нарушено: оно невыполнимо, кроме базового случая subset([],[]) , потому что subset , которое передается в качестве аргумента, является константой, а не переменной. Я полагаю, вместо этого вам нужно правило subgraph(G1,G2) , которое проверяет, что каждый узел G1 является узлом G2, и каждая пара смежных узлов в G1 также является смежной в G2.
Определить или граф есть деревом
Задача:
Определить или неориентированнй взвешенный граф является деревом.
Решить просто: количество ребер должно быть N-1 (где N — количество вершин) и запустить поиск в глубину — проверить связность.
Но посетила мысль! А нельзя ли проще:
проверить количество ребер, что б было N-1 и проверить что б не было вершин со степенью 0. (иключение вариант с одной вершиной).
2 Ответ от cmd 2011-04-03 00:56:33
Re: Определить или граф есть деревом
Тест:
Количество вершин = 7, количество ребер 6
Граф:
1 — 2
2 — 3
Вершин со степень 0 нет, количество ребер = количество вершин — 1.
Без проверки на связность видимо никак.
3 Ответ от Acmefan 2011-04-03 20:13:55
Re: Определить или граф есть деревом
да, точно.
могут же быть циклы в компонентах связности.
А так хотелось проверять «жлобским методом»
4 Ответ от rauf 2011-05-08 13:07:22
Re: Определить или граф есть деревом
We can find it using BFS.
when we reach each node we must increment its degree by one..
if we see that there some nodes with degree >=2 then graph is not tree.
Источник
Определить, является ли неориентированный graph деревом (ациклический связный graph)
Учитывая неориентированный graph, проверьте, является ли он деревом или нет. Другими словами, проверьте, является ли данный неориентированный graph ациклическим связным graphом или нет.
Например, graph, показанный справа, является деревом, а graph слева не является деревом, так как содержит цикл 0—1—2—3—4—5—0 .
Рекомендуем прочитать:
Дерево — это неориентированный graph, в котором любые две вершины соединены ровно одним путем. Другими словами, любой ациклический связный graph является деревом. Мы можем легко определить ациклический связный graph, выполнив обход DFS на Graphе. Когда мы делаем поиск в глубину из любой вершины v в неориентированном Graph мы можем встретить обратное ребро, указывающее на одного из предков текущей вершины v в дереве ДФС. Каждое “заднее ребро” определяет цикл в неориентированном Graph. Если задний край x —> y , то так как y является предком узла x , у нас есть путь от y к x . Итак, можно сказать, что путь y ~~ x ~ y образует цикл. (Здесь, ~~ представляет еще одно ребро в пути, и ~ представляет прямое ребро) и не является деревом.
Алгоритм может быть реализован следующим образом на C++, Java и Python:
Источник
Является ли граф деревом
Дан неориентированный невзвешенный граф. Необходимо определить, является ли он деревом.
Входные данные
В первой строке входного файла содержится одно натуральное число N (N ≤ 100) — количество вершин в графе. Далее в N строках по N чисел — матрица смежности графа: в i-ой строке на j-ом месте стоит 1, если вершины i и j соединены ребром, и 0, если ребра между ними нет. На главной диагонали матрицы стоят нули. Матрица симметрична относительно главной диагонали.
Выходные данные
Вывести «YES», если граф является деревом, и «NO» иначе.
Примеры
входные данные
6
0 1 1 0 0 0
1 0 1 0 0 0
1 1 0 0 0 0
0 0 0 0 1 0
0 0 0 1 0 0
0 0 0 0 0 0
выходные данные
NO
входные данные
3
0 1 0
1 0 1
0 1 0
выходные данные
YES
Мой код (реализован обход по графу в глубину + проверка на наличие петель):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
n = int(input()) a = [] for i in range(n): a.append(list(map(int, input().split()))) vert = [0] color = [0]*n color[0] = 1 while len(vert) != 0: f = 0 for i in range(n): if a[vert[-1]][i] == 1 and color[i] == 0: vert.append(i) color[i] = 1 f = 1 break if f == 0: vert.pop() k = "YES" for i in color: if i == 0: k = 'NO' for i in range(n): if a[i][i] != 0: k = 'NO' print(k)
Источник
Является ли граф деревом
Суть задачи заключается в том, что нужно проверить граф, является ли он деревом. Граф является деревом, если граф — связный и в графе отсутствуют циклы. Проверку на связность я осуществляю с помощью поиска в глубину. Вопрос заключается в том, как мне «написать» проверку на циклы? В просмотренной литературе ничего подходящего найти не могу, либо написано сложно для понимая: векторы и т.д. Надеюсь на помощь начинающему программисту.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
#include using namespace std; void dfs(int v, int **Array, int n, int *Array1) { Array1[v] = 1; for (int i = 0; i n; i++) { if (Array[v][i] == 1 && Array1[i] == 0) dfs(i, Array, n, Array1); } } int main() { //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); int n; cin >> n; int **Array = new int *[n]; for (int i = 0; i n; i++) Array[i] = new int [n]; int *Array1 = new int [n]; for (int i = 0; i n; i++) { for (int j = 0; j n; j++) cin >> Array[i][j]; Array1[i] = 0; } dfs(n - 1, Array, n, Array1); for (int i = 0; i n; i++) { if (Array1[i] == 0) { cout <"NO" ; return 0; } } cout <"YES" ; return 0; }
Является ли граф — деревом?
Доброго времени суток. Есть граф, нужно пробежаться по нему в ширину, и если не встретится циклов.
Определить, является ли граф деревом
Дан неориентированный граф, список инцидентности. Любым способом нужно определить, является ли он.
Дан неориентированный граф. Необходимо определить, является ли он деревом
Дан неориентированный граф. Необходимо определить, является ли он деревом. Формат входных данных.
Проверить, является ли ориентированный граф, с заданным количеством узлов и рёбер, деревом
Дан ориентированный граф из n узлов и m рёбер. Проверить, является ли он деревом. Помогите.
Сообщение было отмечено Catstail как решение
Решение
если у графа н-1 ребро и при этом он связен, то граф — дерево. Проверку на связность напишите сами?
Добавлено через 2 минуты
может быть не очевидно — если он связен и ребер ровно н-1, то циклов быть не может.
Добавлено через 19 минут
чуть позже прикреплю код проверки на циклы.
Добавлено через 6 часов 8 минут
int color[N]; void dfs(int v) { color[v] = 1; for(int i=0; i N; i++) if(g[v][i] != -1 && color[i] == 1) cycle_find = true; color[v] = 2; }
не умею я писать абстрактно. в общем, в чем дело: для каждой вершины мы храним так называемый «цвет». 0 — вершина не посещена до сих пор, 1 — дфс зашел в эту вершину, но еще не вышел, 2 — дфс вышел из вершины. таким образом, если мы идем в вершину с цветом 1, то мы идем в вершину, из которой еще не вышли, то есть образуем цикл.
Источник