• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            糯米

            TI DaVinci, gstreamer, ffmpeg
            隨筆 - 167, 文章 - 0, 評論 - 47, 引用 - 0
            數據加載中……

            [轉]LCA問題(含RMQ的ST算法)

            轉自: http://www.shnenglu.com/Icyflame/

            一、定義與定理
                  LCA:Least Common Ancestors(最近公共祖先),對于一棵有根樹T的任意兩個節點u,v,求出LCA(T, u, v),即離跟最遠的節點x,使得x同時是u和v的祖先。
                  在線算法:用比較長的時間做預處理,但是等信息充足以后每次回答詢問只需要用比較少的時間。
                  離線算法:先把所有的詢問讀入,然后一起把所有詢問回答完成。
                  RMQ:給出一個數組A,回答詢問RMQ(A, i, j),即A[i...j]之間的最值的下標。
            二、DFS+RMQ
                  1)Sparse Table(ST)算法
                  描述:

             1 //初始化
             2 INIT_RMQ
             3 //max[i][j]中存的是重j開始的i個數據中的最大值,最小值類似,num中存有數組的值
             4     for i : 1 to n
             5         max[0][i] = num[i]
             6     for i : 1 to log(n)/log(2)
             7         for j : 1 to n
             8             max[i][j] = MAX(max[i-1][j], max[i-1][j+2^(i-1)]
             9 //查詢
            10 RMQ(i, j)
            11     k = log(j-i+1/ log(2)
            12     return MAX(max[k][i], max[k][j-2^k+1])

                  分析:初始化過程實際上是一個動態規劃的思想。易知,初始化過程效率是O(nlogn),而查詢過程效率是O(1)。ST是一個在線算法。
                  示例:POJ 3368 解題報告
                  2)求解LCA問題
                  描述:
                  (1)DFS:從樹T的根開始,進行深度優先遍歷,并記錄下每次到達的頂點。第一個的結點是root(T),每經過一條邊都記錄它的端點。由于每條邊恰好經過2次,因此一共記錄了2n-1個結點,用E[1, ... , 2n-1]來表示。
                  (2)計算R:用R[i]表示E數組中第一個值為i的元素下標,即如果R[u] < R[v]時,DFS訪問的順序是E[R[u], R[u]+1, ..., R[v]]。雖然其中包含u的后代,但深度最小的還是u與v的公共祖先。
                  (3)RMQ:當R[u] ≥ R[v]時,LCA[T, u, v] = RMQ(L, R[v], R[u]);否則LCA[T, u, v] = RMQ(L, R[u], R[v]),計算RMQ。
                  由于RMQ中使用的ST算法是在線算法,所以這個算法也是在線算法。
                  示例:ZOJ 3195 解題報告
            三、Tarjan算法
                  描述:Tarjan算法是一個離線算法,也就是說只有先獲得所有的查詢,再按一個特定的順序進行運算。

             1 //parent為并查集,FIND為并查集的查找操作
             2 Tarjan(u)
             3     visit[u] = true
             4     for each (u, v) in QUERY
             5         if visit[v]
             6             ans(u, v) = FIND(v)
             7     for each (u, v) in TREE    
             8         if !visit[v]
             9             Tarjan(v)
            10             parent[v] = u
                  示例:HDOJ 2586 解題報告

            posted on 2010-03-10 14:14 糯米 閱讀(1293) 評論(1)  編輯 收藏 引用 所屬分類: Algorithm

            評論

            # re: [轉]LCA問題(含RMQ的ST算法)   回復  更多評論   

            重j開始的i個數據中的最大值
            應該是 從j開始的2^i個數據中的最大值
            2010-07-18 10:03 | xx
            欧美一区二区三区久久综 | 久久夜色tv网站| 日韩欧美亚洲综合久久影院d3| 国产激情久久久久影院老熟女免费| 国产免费久久精品丫丫| 综合久久精品色| 久久被窝电影亚洲爽爽爽| 亚洲精品tv久久久久久久久久| 久久无码人妻一区二区三区| 国产亚洲色婷婷久久99精品91 | 青青青青久久精品国产h| 久久婷婷色香五月综合激情| www性久久久com| 久久久久亚洲AV无码观看| 国产V亚洲V天堂无码久久久| 久久久久久国产a免费观看黄色大片 | 久久精品无码专区免费东京热| 久久国产综合精品五月天| 无码久久精品国产亚洲Av影片 | 少妇内射兰兰久久| 综合久久给合久久狠狠狠97色 | 久久久这里只有精品加勒比| 久久国产精品国产自线拍免费| 久久婷婷人人澡人人爽人人爱| 国产精品伊人久久伊人电影 | 亚洲国产精品18久久久久久| 久久久久久久久久免免费精品 | 偷窥少妇久久久久久久久| 色婷婷综合久久久中文字幕| 久久九九久精品国产| 99久久成人18免费网站| jizzjizz国产精品久久| 久久精品国产亚洲AV蜜臀色欲 | 国产成年无码久久久久毛片| 久久精品国产99久久无毒不卡 | 久久人人爽人人爽人人片AV不 | 久久久亚洲欧洲日产国码aⅴ| 国产精品一区二区久久精品涩爱| 中文字幕久久亚洲一区| 亚洲综合熟女久久久30p| 精品少妇人妻av无码久久|