Если я правильно понимаю проблему, ее можно решить за O ( E ) следующим образом.Давайте начнем с формального определения его решения.
Учитывая DAG G = ( V , E ), пусть FS ( i) будет передней звездой вершины i :
FS ( i ) = {( x , y ) в E : x = i }
let C theбыть набором цветов посещенных вершин и пусть p [ i ] и c [ i ] будут соответственно ценой и цветом вершины i ;Теперь определим вознаграждение r за переход от вершины i к вершине j , принадлежащей FS ( i ) как
r [ i , j ] = p [ j ], если c [ j ] не принадлежит C
в противном случае r [ i , j ] = 0 (если c [ j ] принадлежит C )
Теперь мы готовы определить наши подзадачи следующим образом:
D ( i , j , C ) = max на k , принадлежащих FS ( i ) {r [ i , k ] + D ( k , j , C union {c [ k ]})}
с D ( i , i , C ) = 0 в качестве условия завершения (требуется при достижении узла приемника)
Исходная задача, которая должна быть решена, поэтому D ( s , t , {c [ s ]}), где s и t - соответственно вершина источника и стокаes:
D ( s , t , {c [ s ]}) = max on k принадлежащий FS ( s ) {r [ s , k ] + D ( k , t , {c [ s ]} union {c [ k ]})}
Чтобы решить эту проблему, высохранить DAG, используя списки смежности, соответствующие прямым звездам вершин.Затем, начиная с исходной вершины, вы определяете стоимость, связанную со всеми путями, с учетом цветового ограничения.Поскольку вы в основном исследуете прямые звезды вершин и никогда не возвращаетесь назад, общая сложность составляет O ( E ) с использованием хеш-таблицы для представления набора, так что для вставки теста цвета и членства требуется O (1) время в среднем.То, что я назвал union , на самом деле является операцией insert (результаты одинаковы, так как каждый раз, когда вы выполняете объединение одиночного набора).