1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
| Fanat |
Сообщение
#1
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: 5 |
Как разбить ориентированное дерево на все неизоморфные поддеревья?..Входные данные-например,FO представление.
|
![]() ![]() |
| Michael_Rybak |
Сообщение
#2
|
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: 32 |
Идем от листов вверх к корню, и индексируем по ходу.
Лучше сразу на примере: Берем листья: F, G, H, I, K, L, M, N. Присваиваем каждому из них индекс 0. Между собой соответствующие поддеревья изоморфны, и других таких нет. Теперь рассматриваем узел, у которого все сыновья проиндексированы, а он - нет. Например E. Записываем индексы его сыновей: G(0), H(0); сортируем индексы: (0; 0). Смотрим, есть ли у нас такое поддерево среди рассмотренных? Нету. Значит, это - новое, даем ему индекс 1. Ведем такую табличку: 0: () 1: (0; 0) Берем следующий узел с проиндексированными сыновьями, например B. Записываем его детей: E(1), F(0); сортируем индексы: (0; 1). Такого еще не было, даем индекс 2: 0: () 1: (0; 0) 2: (0; 1) Дальше. Узел C. Дети: M(0), N(0). Сортируем индексы: (0; 0). Это у нас уже было. Это - индекс 1. Узел J. Дети: K(0), L(0). Сортируем индексы: (0; 0). Это у нас уже было. Это - индекс 1. Узел D. Дети: I(0), J(1). Сортируем индексы: (0; 1). Это у нас уже было. Это - индекс 2. Узел А. Дети: B(2), C(1), D(2). Сортируем индексы: (1; 2; 2). Такого еще не было, это будет индекс 3: 0: () 1: (0; 0) 2: (0; 1) 3: (1; 2; 2) Таким образом, в дереве есть 4 вида неизоморфных поддеревьев, и корням изоморных поддеревьев поставлены в соответствие одинаковые индексы. Чтобы делать это за n log n, можно строить префиксное дерево для списка полученных индексов (в котором, например, путь 1-2-2 оканчивается значением 3) |
| Fanat |
Сообщение
#3
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: 5 |
Требуеться разбить на ВСЕ неизоморфные поддеревья.
Алгоритм: Нахождение и удаление висячих вершин. Проверка на изоморфность оргдеревьев. Только вот с реализациеё чето у меня не особо. Даже списковое представление сделать не получаеться. |
| Michael_Rybak |
Сообщение
#4
|
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: 32 |
|
| Fanat |
Сообщение
#5
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: 5 |
Например,рассмотрим такое огрдерево.
Дерево имеет 4 неизоморфных поддерева. Приведено их FO представление. Код program 1; uses crt; type ptr=^elem; elem=record num:integer; next:ptr; end; vector=array[1..100] of ptr; var an,k,ak:ptr; ch:integer; num,kol,nom:integer; f:text; s:char; i,n,j:integer; zap,zap1:vector; procedure del_list(var an:ptr); begin an:=nil; end; procedure add_begin(var an:ptr;num:integer); var k:ptr; begin new(k); k^.next:=an; k^.num:=num; an:=k; end; procedure add_end(var an:ptr;num:integer); var k:ptr; begin new(k); k^.next:=nil; k^.num:=num; an^.next:=k; end; procedure beg_list(var an:ptr;var k:ptr); begin k:=an; end; procedure end_list(var an:ptr;var k:ptr); begin k:=nil; end; procedure next(var k:ptr;var ch:integer); begin ch:=k^.next^.num; end; procedure take_beg(an:ptr;var ch:integer); begin ch:=an^.num; end; begin repeat clrscr; assign(f,'1.txt'); i:=1; reset(f); read(f,kol); for i:=1 to kol do begin del_list(zap[i]); add_begin(zap[i],i); beg_list(zap[i],an) end; i:=1; while not eof(f) do begin read(f,num); write(' ',num); if num=0 then i:=i+1 else add_end(zap[i],num); end; writeln; write(zap[1]^.num,' '); write(zap[1]^.next^.num,' '); writeln(zap[1]^.next^.next^.num); writeln; writeln('Xotite povtoprit? Y/N'); until readkey='n'; end. В этом коде создаем списковое представление дерева.Просьба подправить, так как оно создаётся неверно. Что-то со ссылками.Напиример в рассмотреном нами дереве результат будет 1 4 268 вместо должного 1 2 4. Сообщение отредактировано: Fanat - |
| Michael_Rybak |
Сообщение
#6
|
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: 32 |
Приведи, пожалуйста, определения "FO представление" и "ориентированное дерево"
|
Fanat Теория графов.Оргдеревья. 4.11.2006 15:48
Fanat Ориентированное дерево — это ориентированный граф … 7.11.2006 5:17
Michael_Rybak Я сейчас выхожу, подумаю над задачей в дороге. А т… 7.11.2006 13:40
Michael_Rybak И еще: "без циклов" = без ориентированны… 7.11.2006 18:47
Fanat
И еще: "без циклов" = без ориентированн… 7.11.2006 22:48
Michael_Rybak
Алгоритм: как представляю себе я, подвесим граф з… 8.11.2006 0:36
Fanat Можешь на примере показать что мы храним в массива… 8.11.2006 1:40
Michael_Rybak
Можешь на примере показать что мы храним в массив… 8.11.2006 2:05
Fanat Сколько думал, а сделать ничё не могу..... :blink: 14.11.2006 21:49
Michael_Rybak Давай шаг за шагом.
1. Напиши программу, которая … 14.11.2006 22:58
Маня Такая вот задача:
требуется определить изоморфны л… 8.11.2006 4:15
Michael_Rybak Прочти мой первый пост здесь.
Алгоритм, который я… 8.11.2006 6:18
Маня Послушайте! А если я сделаю так?
Как всё это н… 16.11.2006 3:41
Michael_Rybak Эвристики тут ни к чему. Сравнить два графа можно … 16.11.2006 4:49
Маня Там все связано с разбиением деревьев на поддеревь… 17.11.2006 2:40
Michael_Rybak Там *не все* связано с разибиением на поддеревья. … 17.11.2006 3:25
Маня понимаешь,я уже несколько раз все твои сообщения п… 18.11.2006 23:30
Michael_Rybak Давай разберемся с тем, что я называю индексацией.… 19.11.2006 6:01
Маня Ой !!! Спасибо огромное!
Знаешь,а… 20.11.2006 3:48
Michael_Rybak Молодец, Маня, порадовала! :)
Да, очень прав… 20.11.2006 6:17
Маня :good: :good: :good:
Просто СУПЕР!!… 23.11.2006 2:26
Маня О!!! У меня родилась идея,точнее мысль… 23.11.2006 3:26
Michael_Rybak Молодец что придумала пример :)
Видишь? Не зано… 23.11.2006 8:33
Маня Значится так, вот как я поняла этот алгоритм: :… 28.11.2006 15:26
Michael_Rybak Схему ты описала правильно, но вот правильно ли ты… 28.11.2006 18:46![]() ![]() |
|
Текстовая версия | 7.11.2025 9:10 |