gds 19.03.2013 11:14 umodniA63A5C27

Посоны, помогите с задачкой. Я совсем разучился в графы. Наговнокодить могу, но должно быть красивое решение (скорее всего, ещё и более быстрое, чем наивный говнокод).
Есть направленный ациклический граф: https://docs.google.com/drawings/d/1OPIv...
Задана вершина, из которой не выходит рёбер (тут — Z). Пометим её.
Хочется пройти по графу так, чтобы на каждом следующем шаге прохода были помечены только те узлы, у которых все дети помечены тоже. (пофиг, все из таких узлов, или ровно один на каждом шаге.)
Граф может быть немаленьким, но часто будет оказываться так, что более нескольких шагов алгоритма делать не нужно. То есть, вполне приемлем ленивый алгоритм такого обхода.

cs, it, math
1. nicka 19.03.2013 11:15 notebook

смотри банальные алгоритмы закраски области. Это именно оно.

2. Polaris 19.03.2013 11:16

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

3. gdsnicka /1 19.03.2013 11:16

в общем случае — не оно. А вот какой-то специфичный алгоритм закраски может и подойдёт.

4. nicka 19.03.2013 11:16 notebook

банально пихаем в очередь те точки ,которые видим из текущей точки.
текущую выбираем из очереди.

5. gdsPolaris /2 19.03.2013 11:18

вот что-то такое и хотел наговнокодить, да вот не знаю, как-то не очень красиво. Но, если других идей не будет, то придётся.

6. gdsnicka /4 19.03.2013 11:19

из Z мы видим D, но её пихать раньше, чем пихнём H и F, не можем.

7. nickagds /6 19.03.2013 11:21 notebook

то есть, пихать можно только того, от кого все выходы оприходованы?

8. 0x2207 19.03.2013 11:21 epsilon

A* ?

9. gdsnicka /7 19.03.2013 11:22

таки да: "чтобы на каждом следующем шаге прохода были помечены только те узлы, у которых все дети помечены тоже"

10. ulidtko0x2207 /8 19.03.2013 11:22

ппц у тебя аватарка модная теперь

11. Kakadu 19.03.2013 11:24

Мне это очень напомнило поиск в ширину, только по стрелочкам надо в другую сторону ходить.

12. KakaduKakadu /11 19.03.2013 11:25

Т.е. не поиск в ширину, а топологическую сортировку.

13. nickagds /9 19.03.2013 11:25 notebook

тогда модифицируем алгоритм так:
при вынимании из очереди проверяем возможность закраски.
при невозможности пихаем обратно в хвост очереди.

если добавлений в очередь извне не было на протяжении 1 круга по очереди, то мы встали раком.

14. gds0x2207 /8 19.03.2013 11:39

в нём надо стоимость узлов расставлять хитро, чтобы проход был в нужном мне порядке. Сходу не соображу, как.

15. gdsKakadu /12 19.03.2013 11:41

вот, тоже напомнило. Но что-то пробовал на бамажке, не получалось. Попробую ещё.
А стрелочки — фигня, у меня есть и обратные стрелочки для этих целей.

16. gdsnicka /13 19.03.2013 11:42

да, вот что-то такое и думал, но, может, есть покрасивше что.

17. nickagds /16 19.03.2013 11:44 notebook

хз..

Do you really want to delete ?