問題定義
無向圖 G (n≤20000, m≤200000),給定生成樹 T。割若只切斷 T 中**恰好一條**邊,則稱該割尊重 T。求 G 中尊重 T 的最小割容量(邊數)。
核心觀察
尊重 T 的割對應 T 中某條邊 `e=(u,v)` 的移除,將樹分為兩個連通分量。割容量 = G 中連接這兩個分量的**非樹邊**數量 + 1 (樹邊 e 本身)。
即:對 T 中每條邊,計算跨越該邊分割的非樹邊數,取最小值 +1。
算法:樹上差分 + LCA
- 對每條非樹邊 `(x,y)`,在樹上 `x` 到 `y` 的路徑上所有邊的計數器 `+1` (表示這條非樹邊跨越了路徑上的每條樹邊)。
- 樹上差分:`cnt[x]++, cnt[y]++, cnt[lca]-=2`,最後 DFS 後序累積得到每條樹邊的跨越非樹邊數。
- 答案 = `min(cnt[tree_edge]) + 1`。
複雜度
- O((n+m) log n) (LCA 倍增) 或 O(n+m) (Tarjan 離線 LCA)。
參考題解