У меня ациклический ориентированный граф. Я хотел бы назначить уровни каждой вершине таким образом, чтобы гарантировать, что если ребро (v1, v2) находится в графе, то level (v1)> level (v2). Мне также хотелось бы, чтобы level (v1) = level (v3) всякий раз, когда (v1, v2) и (v3, v2) были на графике. Кроме того, возможные уровни дискретны (с таким же успехом можно принять их за натуральные числа). Идеальным случаем было бы, что level (v1) = level (v2) + 1 всякий раз, когда (v1, v2) находится в графе и нет другого пути от v1 к v2, но иногда это невозможно с другими ограничениями - например, рассмотрим граф на пяти вершинах с ребрами (a, b) (b, d) (d, e) (a, c) (c, e).
Кто-нибудь знает достойный алгоритм для решения этой проблемы? Мои графики довольно малы (| V | ‹= 25 или около того), поэтому мне не нужно что-то сногсшибательное - простота важнее.
До сих пор я думал просто найти наименьший элемент, присвоить ему уровень 0, найти всех родителей, назначить им уровень 1 и разрешить противоречия, добавив +0,5 к соответствующим вершинам, но это кажется довольно ужасным.
Кроме того, у меня возникает ощущение, что было бы полезно удалить все «неявные» ребра (т.е. удалить (v1, v3), если граф содержит как (v1, v2), так и (v2, v3).