guevara
@guevara
Comandante

Как сократить число дуг в орграфе с сохранением «степени» вершин?

Введем понятие "степени" вершины d(x) ориентированного графа как разницу полустепени исхода и полустепени захода. Простыми словами: d(x) = сумма_весов_исходящих_дуг - сумма_весов_входящих_дуг
Получается, что сумма "степеней" всех вершин равна нулю.
a5603b447b3c4c74a165166c4a83b462.jpg
Задача: построить на основе заданного графа новый граф с таким же набором вершин с такими же d(x), но с минимальным числом дуг и с минимально возможными весами этих дуг. Можно строить несвязный граф.

Пример:
d6283b257ad74306ae063e60d0338e57.jpg

Дискретную математику изучал сравнительно давно и многое забыл уже. Такая задача всплыла в моем проекте. Сам сходу решить не смог, а что-то подобное не могу найти, но есть ощущение, что это какая-то классическая задача. Прошу прощения, если не использовал устоявшуюся терминологию.
  • Вопрос задан
  • 306 просмотров
Решения вопроса 1
guevara
@guevara Автор вопроса
Comandante
Кажется, я нашел ответ на вопрос. Здесь подобная задача:
stackoverflow.com/questions/15723165/algorithm-to-...

В ответах дана публикация про эту задачу, которая, похоже, NP-полна. Буду изучать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@mamkaololosha
1) Строите минимальное остовное дерево, игнорируя веса
en.wikipedia.org/wiki/Minimum_spanning_tree
2) Проставляете веса
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
Проще всего - найти произвольный цикл, в нём - ребро наименьшего веса, и вычесть этот вес из всех рёбер. Продолжать, пока циклов не останется. Но результат может быть сильно неоптимальным.
Можно искать цикл, в котором наименьший вес ребра максимален (добавлять рёбра начиная с самого тяжёлого, пока в графе не появится цикл). Тогда результат должен получиться заметно лучше (по сумме весов). Но число рёбер может быть не минимальным.
Кстати, можно ли увеличивать веса дуг (из графа (1,2,w=1), (2,3,w=2), (1,3,w=4) получить (2,3,w=1),(1,3,w=5))? Если да, то после того, как циклы в ориентированном графе кончились, придётся искать циклы в неориентированном графе, и прибавлять ко всем рёбрам наименьший по модулю вес ребра с учётом направления рёбер (вычитать из попутных и прибавлять ко встречным).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы