У меня есть решение O (1) для проверки возможности включения ребра в график. Однако вам понадобится худший случай O (n) , чтобы вставить ребро.
Вы можете сохранить двоичную матрицу достижимости R
, где R[u, v]=1
, если вы можете достичь v
с u
в вашем текущем графике и R[u, v]=0
, если нет. R
можно вычислить один раз, используя Флойд-Варшалл .
Если вы хотите проверить, можете ли вы включить ребро (u,v)
, вам просто нужно проверить, если R[v, u] = 0
. Если это R[v, u] = 1
, вы строите круг, вставляя (u,v)
.
Остальной проблемой становится обновление этой структуры. Если в итоге вы вставите ребро (u, v)
в график, вы установите R[u, v] = 1
. Кроме того, все узлы, которые смогли достичь u
(R[:,u]=1
), теперь могут достигать всех узлов, достижимых на v
(R[v,:] = 1
). Таким образом, вам нужно будет установить свои записи R[i, j] = 1
, если R[i,u] = 1
и R[v:j] = 1
.
К сожалению, шаг обновления примет O (n) в худшем случае
Если вы хотите выбрать возможное ребро случайным образом, вам придется дополнительно поддерживать и обновлять список возможных ребер через ту же структуру.