IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Теория графов.Оргдеревья., Разбиение оргдеревьев.
Fanat
сообщение 4.11.2006 11:48
Сообщение #1


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Как разбить ориентированное дерево на все неизоморфные поддеревья?..Входные данные-например,FO представление.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Маня
сообщение 22.11.2006 23:26
Сообщение #2





Группа: Пользователи
Сообщений: 9
Пол: Женский

Репутация: -  1  +


О!!! У меня родилась идея,точнее мысль nea.gif

Примеры графов в прикрепленных файлах.
Выходит,что у первого графа итог 5- (3,4), соедин. 3, у второго 5-(3,4), соедин. 3,выходит,что они изоморфны, но даже по рисункам с первого взгляда видно, что они неизоморфны.Что это значит? Что способ неверен? или же мы проверяем не только конечный итог, но весь массив?
Для первого это:

0-лист
1-(0,1)
2-(0,3)
3-(1,3)
(2,2)
4-(2,1)
5-(3,4)

Для второго:

0-лист
1-(0,1)
2-(0,3)
3-(1,3)
4-(2,2)
5-(3,4)

Прикрепленное изображение

Прикрепленное изображение


--------------------
Потому что, потому что
Всех нужнее и дороже,
Всех доверчивей и строже
В этом мире доброта
В этом мире ДОБРОТА
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Michael_Rybak
сообщение 23.11.2006 4:33
Сообщение #3


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Молодец что придумала пример smile.gif

Цитата
Теперь делаем то же самое с другим графом, причем табличку строим не заново, а продолжаем строить эту! Если они изоморфны, то в конце он тоже свернется в пару 3-4, соединенную ребром вида 3, и получит индекс 5.


Видишь? Не заново, а продолжаем строить эту!

Что касается реализации - на паскале я бы сначала слегка застрелился, а потом бы уже писал. STL все-таки страшно развращает. Ты на чем собралась писать?

Граф я храню FO представлением, но таким двойным: из каждой вершины помню все ребра, и входящие, и исходящие. Каждое ребро, таким образом, встречается 2 раза. При этом на каждом ребре ставлю отметку, какое оно (туда, обратно или в обе стороны).

Результат свертки для каждой вершины храню отдельной структурой (динамическим массивом, содержащим в порядке возрастания индексы приклееных вершин).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Маня
сообщение 28.11.2006 11:26
Сообщение #4





Группа: Пользователи
Сообщений: 9
Пол: Женский

Репутация: -  1  +


Значится так, вот как я поняла этот алгоритм: !low.gif

1. сравниваем кол-во вершин в обоих графах,если разное, то неизоморфны,иначе
2. находим концевые вершины
3. сравниваем кол-во концевых вершин в обоих графах, если разное, то неизоморфны,иначе
4. индексируем их,т.е. записываем в динамический массив данные о вершине, например
vershina^[1].Name:='1';
vershina^[1].indeks:=0
5. смотрим,с какими вершинами соединены концевые вершины и рёберную связь между ними
(если выходит - 1, входит - 2, двусторон. - 3)
6. запишем эту информацию просто в массив,который будет хранить значения индексов,значит у нас (0,1) - 1
7. сравниваем кол-во вершин,соедин. с концевыми вершинами в обоих графах,если разное, то неизоморфны,иначе
8. записываем эту информацию к вершинам vershina^[2].Name:='2';
vershina^[2].indeks:=1;

В ИТОГЕ МЫ ПОЛУЧАЕМ ПРОЦЕДУРУ,СОСТОЯЩУЮ ИЗ 3-Х ПУНКТОВ,КОТОРУЮ НУЖНО ПРОКРУЧИВАТЬ В ЦИКЛЕ.
9. у нас получатся 2 динамических массива
10. начинаем сравнивать эти 2 массива,как сравнивать я призабыла...к вечеру разберусь

Так вот... chore.gif

Ну как? Правильно ли я поняла? ypriamii.gif

Вот вопросик: 10.gif как по FO-представлению мы можем найти концевые вершинки? blink.gif


--------------------
Потому что, потому что
Всех нужнее и дороже,
Всех доверчивей и строже
В этом мире доброта
В этом мире ДОБРОТА
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Michael_Rybak
сообщение 28.11.2006 14:46
Сообщение #5


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Схему ты описала правильно, но вот правильно ли ты понимаешь центральное место - индексацию вершины - я не очень понял.

Мне кажется, тут нужен один большой динамический массив, каждый элемент которого - это набор пар (индекс-ребро), свернувшихся в некоторую вершину.

Вот в нашей табличке:

0-лист
1-(0,1)
2-(0,3)
3-(1,3) (2,2)
4-(2,1)
5-(3,4)

Каждая строка здесь - это элемент вот этого динамического массива. Типа такого:

type TPair = record //структура для хранения одного "свернутого" объекта
child_index: integer;
type_of_edge: byte;
end;


type TBlock = record //структура для хранения одной строки нашей таблички
index: integer;
kids: Array of TPair
end;

var a: Array of TBlock; //массив, содержащий всю таблицу индексации.



На каждой итерации ты все глубже залазишь в граф, сворачивая листы, появившиеся после предыдущей итерации. У каждой вершины на протяжении этого процесса хранится ее TBlock, в котором index пока что неивестен, а kids заполняется. Когда ты сворачиваешь лист, ты смотришь, к какой вершине он свернется, и вписываешь этот лист к блоку той вершины, в которую он свернется (вместе с типом ребра).

Т.е. ты еще в начале объявляешь массив блоков:

var b: array [1..n] of TBlock;


В начале все блоки пусты. Когда вершина i сворачивается к вершине j, то в блок b[j] дописывается в поле kids пара TPair, в которой child_index - это индекс, присвоенный вершине i, а type_of_edge - тип ребра, соединяющего i и j.

А когда j станет листом (т.е. все связанные с ней вершины, кроме одной, свернутся в нее), то в b[j].index мы запишем его индекс, полученный путем поиска b[j] в массиве a, т.е. в нашей табличке.



Короче, Маня. Знаешь, с чего начни. Начни с того, что напиши программу, которая просто сворачивает граф. Т.е. на входе - ФО представление, на выходе что-то такое:

Код
Шаг 1
  Листы: 1 2 5 9
    В лист 1 свернулись:
    В лист 2 свернулись:
    В лист 5 свернулись:
    В лист 9 свернулись:
Шаг 2
  Листы: 3 4 7
    В лист 3 свернулись: 1 2
    В лист 4 свернулись: 9
    В лист 7 свернулись: 5
Шаг 3
  Листы 6 8
    В лист 6 свернулись: 3 7
    В лист 8 свернулись: 4
Итог:
  Граф свернулся в ребро, соединяющее вершины 6 и 8.


Т.е. никакой индексации, просто свертка.

Цитата
как по FO-представлению мы можем найти концевые вершинки?


Можно так.
Заведи массив start[n], в котором в start[i] хранится начало списка достижимых из i вершин (в FO представлении).

Например

FO представление:

5
2 3 0 5 0 1 0 3 0 0

start[1] = 1
start[2] = 4
start[3] = 6
start[4] = 8
start[5] = 10

Теперь чтобы узнать, какие ребра идут из вершины x, мы идем по ФО прелставлению, начиная с позиции start[x], и пока не встретим 0.

Чтобы узнать, какая вершина является листиком, надо посчитать, сколько несвернутых вершин с ней соединены.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Fanat   Теория графов.Оргдеревья.   4.11.2006 11:48
Michael_Rybak   Идем от листов вверх к корню, и индексируем по ход...   4.11.2006 12:45
Fanat   Требуеться разбить на ВСЕ неизоморфные поддеревья....   6.11.2006 13:13
Michael_Rybak   Требуеться разбить на ВСЕ неизоморфные поддеревья...   6.11.2006 13:55
Fanat   Например,рассмотрим такое огрдерево. Дерево имее...   6.11.2006 21:00
Michael_Rybak   Приведи, пожалуйста, определения "FO представ...   6.11.2006 22:01
Fanat   Ориентированное дерево — это ориентированный граф ...   7.11.2006 1:17
Michael_Rybak   Я сейчас выхожу, подумаю над задачей в дороге. А т...   7.11.2006 9:40
Michael_Rybak   И еще: "без циклов" = без ориентированны...   7.11.2006 14:47
Fanat   И еще: "без циклов" = без ориентированн...   7.11.2006 18:48
Michael_Rybak   Алгоритм: как представляю себе я, подвесим граф з...   7.11.2006 20:36
Fanat   Можешь на примере показать что мы храним в массива...   7.11.2006 21:40
Michael_Rybak   Можешь на примере показать что мы храним в массив...   7.11.2006 22:05
Fanat   Сколько думал, а сделать ничё не могу..... :blink:   14.11.2006 17:49
Michael_Rybak   Давай шаг за шагом. 1. Напиши программу, которая ...   14.11.2006 18:58
Маня   Такая вот задача: требуется определить изоморфны л...   8.11.2006 0:15
Michael_Rybak   Прочти мой первый пост здесь. Алгоритм, который я...   8.11.2006 2:18
Маня   Послушайте! А если я сделаю так? Как всё это н...   15.11.2006 23:41
Michael_Rybak   Эвристики тут ни к чему. Сравнить два графа можно ...   16.11.2006 0:49
Маня   Там все связано с разбиением деревьев на поддеревь...   16.11.2006 22:40
Michael_Rybak   Там *не все* связано с разибиением на поддеревья. ...   16.11.2006 23:25
Маня   понимаешь,я уже несколько раз все твои сообщения п...   18.11.2006 19:30
Michael_Rybak   Давай разберемся с тем, что я называю индексацией....   19.11.2006 2:01
Маня   Ой !!! Спасибо огромное! Знаешь,а...   19.11.2006 23:48
Michael_Rybak   Молодец, Маня, порадовала! :) Да, очень прав...   20.11.2006 2:17
Маня   :good: :good: :good: Просто СУПЕР!!...   22.11.2006 22:26
Маня   О!!! У меня родилась идея,точнее мысль...   22.11.2006 23:26
Michael_Rybak   Молодец что придумала пример :) Видишь? Не зано...   23.11.2006 4:33
Маня   Значится так, вот как я поняла этот алгоритм: :...   28.11.2006 11:26
Michael_Rybak   Схему ты описала правильно, но вот правильно ли ты...   28.11.2006 14:46


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 17:21
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"