![]() |
![]() |
|
v8: проверка цикличности графа | ☑ | ||
---|---|---|---|---|
0
EveryAndrey
13.11.08
✎
13:33
|
проблема следующая, в процедуру передается двухмерная матрица, которая по сути является представлением графа, но уже с выделенными циклами.
(т.е. целиком задача заключается в проверке цикличности графа, и если цикличный, то выделить цветом вершины) так вот, пишу так Процедура ОтметитьЦиклы(M) N = M.count(); i=0; ЦТ = Новый ЦВЕТ(255,0,0); while i < N do j=0; while j < N do if (M[i][j]) then ЭлементыФормы.СвязиЗадач.ОформлениеСтроки(ЭлементыФормы.СвязиЗадач.Значение.Получить(i)).ячейки[j+1].цветТекста = ЦТ; endif; j = j+1; enddo; i = i +1; enddo; ЭлементыФормы.СвязиЗадач.ОбновитьСтроки();//ради эксперимента КонецПроцедуры вот, цветом не выделяет. сморю в отладчике, вроде по структуре все норм, никаких ошибок. строчку присваивания проходит, но цвет не менят. СвязиЗадач - табличное поле, типЗначения - таблица значений что не так делаю? |
|||
1
GenV
13.11.08
✎
13:36
|
(0) Читал СП про ОформлениеСтроки?
|
|||
2
EveryAndrey
13.11.08
✎
13:39
|
(1) Если имеются ввиду желтые книжки с описанием синтаксиса язывка, то нет.
а синтаксис помщьнике чтот ничего полезного не заметил |
|||
3
bd
13.11.08
✎
13:40
|
Могу ошибаться (ибо новечокъ), но изменение параметров структур ОформлениеСтроки и ОформлениеЯчейки вне обработчиков некоторых событий (ПриВыводеСтроки, ПриПолученииДанных) не приводит к перерисовке ТабличногоПоля.
|
|||
4
GenV
13.11.08
✎
13:43
|
(3) Именно так в Синтаксис Помошнике и написано :)
|
|||
5
EveryAndrey
13.11.08
✎
13:45
|
(4) да, прочитал.. там просто два объекта ОформлениеСтроки.. не тот читал..
сейчас увидел.. (3)спасибо (4)спасибо :) |
|||
6
EveryAndrey
13.11.08
✎
13:46
|
хотя можете подскажете заодно как событие вызвать? а то не соображаю уже :)
|
|||
7
GenV
13.11.08
✎
13:49
|
(6) Вешай на форму на табличное поле обработчик события ПриПолученииДанных или ПриВыводеСтроки. Там заполняй ОформлениеСтроки в цикле (ПриПолученииДанных) или для текущей строки (ПриВыводеСтроки) по хранящеммуся отделно Массиву/ТЗ/Соответствию.
|
|||
8
bd
13.11.08
✎
13:50
|
(6) ИМХО никак. Вызов функции определения цикличности графа нужно вызывать в обработчике ПриПолученииСтроки, и строки красить там же. Соответственно, наверняка упрёшься в проблемы перфоманса и оптимизации.
|
|||
9
Михаил Козлов
13.11.08
✎
14:17
|
Не понял, как Вы определяете цикличность в графе (вижу только обход матрицы смежности)?
Часто для этой цели используют такой алгоритм (Мака): 1. поиск вершин без входов; 2. если таких нет, то цикл, если есть, то "вычеркивание" исходящих ребер и на 1. |
|||
10
EveryAndrey
13.11.08
✎
14:32
|
(9) да поиска циклов нету в примере, матрица уже с найденными вершинами, это я так для общего понимая сказал. а алгоритм да, такой и использую.
на счет подкраски сделал в методе ПриПолученииДанных, все красит, правда получает данные в "бесконечном" режиме..(я это определяю по непрерывном потоке сообщений о том что граф цикличный в служебных сообщениях :) ) может подкраска вызывает рекурсивное получение данных? или еще как нить. ладно, в любом случае задача хоть как то решена.. осталось только с мелочами неприятными разобраться :) |
|||
11
Валерыч
14.11.08
✎
05:03
|
для анализа цикличности я использую матрицу транзитивности (если конечно граф направленный). Можете воспользоваться методами, скачав мою обработку с http://infostart.ru/profile/36029/projects/2391/
Там есть функции для поиска циклических вершин. Работает очень быстро. На входе таблица связей графа (Источник Приемник) на выходе - массив вершин, входяфщих в циклы. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |