首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

最小割問題:給定生成樹 T 求圖 G 對 T 的最小割

     編輯:程式設計疑難解答

問題定義

無向圖 G (n≤20000, m≤200000),給定生成樹 T。割若只切斷 T 中**恰好一條**邊,則稱該割尊重 T。求 G 中尊重 T 的最小割容量(邊數)。

核心觀察

尊重 T 的割對應 T 中某條邊 `e=(u,v)` 的移除,將樹分為兩個連通分量。割容量 = G 中連接這兩個分量的**非樹邊**數量 + 1 (樹邊 e 本身)。
即:對 T 中每條邊,計算跨越該邊分割的非樹邊數,取最小值 +1。

算法:樹上差分 + LCA

  1. 對每條非樹邊 `(x,y)`,在樹上 `x` 到 `y` 的路徑上所有邊的計數器 `+1` (表示這條非樹邊跨越了路徑上的每條樹邊)。
  2. 樹上差分:`cnt[x]++, cnt[y]++, cnt[lca]-=2`,最後 DFS 後序累積得到每條樹邊的跨越非樹邊數。
  3. 答案 = `min(cnt[tree_edge]) + 1`。

複雜度

  • O((n+m) log n) (LCA 倍增) 或 O(n+m) (Tarjan 離線 LCA)。

參考題解

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved