動態樹的經典應用

2021-09-19 23:31:17 字數 761 閱讀 9851

——————摘自《高階資料結構》

1。求最近公共祖先

基於動態樹的基本操作,我們很容易在較短的時間內求得任意兩個結點u和結點v(在同一棵樹中)的最近公共祖先。首先對u執行access(u)操作,同時記錄被訪問過的結點(在平衡樹上打標機即可);然後執行access(v)操作,當第一次碰到已經訪問過的點w時,該w就是u和v的最近公共祖先。時間複雜度是o(nlog2n).

2.並查集操作

在並查集操作一章我們看到了如何維護兩個集合進行合併操作,然而並查集不支援既有合併又有分離的操作。類似並查集的樹形結構,用動態樹來維護這種森林連通性的變換非常方便

3.求最大流

通過用動態樹改造最短路徑增光路演算法,可以再o(nmlog2n)的時間複雜度內得到網路最大流,其中n為頂點數,m為邊數。演算法的大致思想:剛開始執行時,每個頂點為單獨的一棵樹,每次增廣的時候選擇一條未滿流的邊,用來給當前的樹連線新的結點,如果發現已經找到了匯點,那麼每次增廣的流量就是樹中源點到匯點路徑上所有邊中最小增廣量,將路徑上的邊增廣相應流量後,將滿流邊刪去,然後繼續執行增廣。

4。求最小生成樹

增量構造法求最小生成樹的方式————依次新增邊,如果發現當前的邊新增後形成了環,那麼將環上的最大邊權刪去,直到更新完了為止。這種增量式的演算法如果用動態樹維護將會非常高效。我們所需要的操作除了幾個動態樹級別的操作之外,還需要維護任意兩個點之間的路徑上的權值最大的邊,該資訊可以用平衡樹維護。

除了一般的最小生成樹之外,其他的一些問題,例如度限制最小生成樹或者對邊使用有限制的生成樹也用動態樹問題來建模也可以得到不錯的效果。

經典的動態規劃

有乙個動態規劃100例.看到機房裡shenben的複習資料.加上垃圾的dp.整理一下。一 資源分配問題 題目大意 有m個裝置,n個公司,v i j 表示第i個公司分j個裝置的貢獻值。怎樣分配使貢獻值的和最大?狀態 前i個公司分j個裝置。f i j 表示前i個公司分j個裝置,列舉第i個公司分k個裝置。...

for迴圈的經典應用

for迴圈是非常重要的語法結構,以下是總結了在學習過程中遇到比較值得思考的問題 一 for迴圈的語法格式主要分為以下幾步 1 for 初始化變數 i to 變數i的終值 step 1 需要執行的 next i.二 舉個簡單一點的例子 show dim i as integer for i 0 to ...

演算法 常用經典動態規劃應用場景總結

1 給定乙個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有數字累加起來就是路徑和,返回所有路徑中最小路徑和,如果給定的m如大家看到的樣子,路徑1,3,1,0,6,1,0就是路徑中和最小的,所以返回12。矩陣m13 5981 3450 6188 40解題思路 生成大小和m...