Имя: Пароль:
1C
 
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/
Там есть функции для поиска циклических вершин. Работает очень быстро.
На входе таблица связей графа (Источник Приемник) на выходе - массив вершин, входяфщих в циклы.