經典問題 1 —— DAG 上區間限制拓撲序

CharlieVinnie發表於2023-01-26

問題描述

給定一個 DAG,求一個拓撲序,使得節點 \(i\) 的拓撲序 \(\in [l_i,r_i]\)

題解

首先進行一個預處理:對於所有 \(u\),令 \(\forall (v,u)\in E, l_u\leftarrow \max(l_u,l_v+1),\forall (u,v)\in E, r_u\leftarrow \min(r_u,r_v-1)\)

也就是 \(l_u\) 對任何可能的拓撲序的最小值取 \(\max\)\(r_u\) 同理。若此時有節點 \(l_u>r_u\) 則無解。

將所有區間按 \(r\) 端點排序,然後以 \(l\) 端點為關鍵字插入大根堆中。從大到小依次考慮拓撲序 \(i\) 應為哪個節點,將所有 \(r_u\ge i\) 的節點插入堆中,然後取出 \(l_u\) 最大的,若 \(l_u>i\) 則顯然無解,否則直接令 \(topo_i=u\),彈堆。由貪心交換性質應該可以證明這是可能的最優情況,如果這樣都無解那麼一定無解。至於正確性,我們發現如果當前存在 \(j>i\) 使得 \((topo_j,topo_i)\in E\),則會有 \(l_{topo[i]}>l_{topo[j]}\),與每次取出 \(l\) 最大的區間矛盾。

相關文章