Проблема может быть решена путем динамического программирования следующим образом.Давайте начнем с формального определения его решения.
Учитывая DAG G = (V, E)
, пусть C
будет набором цветов посещенных вершин и пусть w[i, j]
и c[i]
будут соответственно весом (расстоянием)связанный с ребром (i, j)
и цветом вершины i
.Обратите внимание, что w[i, j]
равно нулю, если ребро (i, j)
не принадлежит E
.Теперь определим расстояние d
для перехода от вершины i
к вершине j
с учетом C
как
d[i, j, C] = w[i, j] if i is not equal to j and c[j] does not belong to C
= 0 if i = j
= infinite if i is not equal to j and c[j] belongs to C
Теперь мы готовы определить наши подзадачи следующим образом:
A[i, j, k, C]
= кратчайший путь от i
до j
, который использует ровно k
ребер и учитывает цвета в C
, так что никакие две вершины в пути не будут окрашены в один и тот же цвет (один из цветовв C
)
Пусть m
будет максимальным числом ребер, разрешенных в пути, и предположим, что вершины помечены как 1, 2, ..., n
.Пусть P[i,j,k]
будет вершиной предшественника j
в кратчайшем пути, удовлетворяющей ограничениям от i
до j
.Следующий алгоритм решает проблему:
for k = 1 to m
for i = 1 to n
for j = 1 to n
A[i,j,k,C] = min over x belonging to V {d[i,x,C] + A[x,j,k-1,C union c[x]]}
P[i,j,k] = the vertex x that minimized A[i,j,k,C] in the previous statement
Установите начальные условия следующим образом:
A[i,j,k,C] = 0 for k = 0
A[i,j,k,C] = 0 if i is equal to j
A[i,j,k,C] = infinite in all of the other cases
Общая вычислительная сложность алгоритма составляет O(m n^3)
;принимая во внимание, что в вашем конкретном случае m = 14
(поскольку вы хотите ровно 15 узлов), из этого следует, что m = O(1)
, так что сложность на самом деле составляет O(n^3)
.Для представления набора C
используйте хеш-таблицу, так что для тестирования вставки и членства требуется в среднем O (1).Обратите внимание, что в алгоритме операция C union c [x] на самом деле является операцией вставки, в которой вы добавляете цвет вершины x в хеш-таблицу для C. Однако, поскольку вы вставляете только элемент, операция set union приводит кточно такой же результат (если цвет отсутствует в наборе, он добавляется; в противном случае он просто отбрасывается и набор не изменяется).Наконец, для представления группы доступности базы данных используйте матрицу смежности.
Как только алгоритм будет выполнен, чтобы найти минимальный кратчайший путь среди всех возможных вершин i
и j
, просто найдите минимум среди значений A[i,j,m,C]
.Обратите внимание, что если это значение равно бесконечное , то допустимого кратчайшего пути не существует.Если существует допустимый кратчайший путь, то вы можете определить его, используя значения P[i,j,k]
и проследив в обратном направлении по вершинам предшественника.Например, начиная с a = P[i,j,m]
последнее ребро на кратчайшем пути - (a,j)
, предыдущее ребро задается как b = P[i,a,m-1]
, оно равно (b,a)
и так далее.