亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

自己對樹鏈剖分的理解(模板)

2019-11-14 09:48:29
字體:
來源:轉載
供稿:網友

        說到樹鏈剖分,其實故事還挺多的。我記得在高中的OI經歷中,我曾無數次聽到這個名詞,各種省賽、邀請賽貌似都會考這個東西,那時我覺得樹鏈剖分深不可測,是我等蒟蒻不能理解的東西……然后我還記得,某年(好像是NOip2014?)有一題貌似也要用樹鏈剖分??傊潜慌暗囊籅,然后現在覺得這個東西也沒什么難的……

        好吧,言歸正傳。所謂樹鏈剖分其實就是樹的輕重鏈剖分,而樹鏈就是指從某一父節點一直到葉子節點的一條鏈。下面先介紹幾個概念:

                1、重兒子:父節點的所有兒子中,子樹節點數目最多的兒子

                2、重邊:連接父節點和兒子的邊

                3、重鏈:從父節點往下所有重兒子連在一起的鏈

        有了這些定義,我們就能顯而易見的發現:任何節點都只屬于一條樹鏈。然后按照這樣把一棵樹剖分成這樣一條一條的樹鏈,樹鏈剖分就完成了,如圖:

                                                        

其中這棵樹被剖分成了紅、綠、藍三條鏈,但是要注意,圈出來的兩條邊其實是不屬于樹鏈的。是的完成了這個,樹鏈剖分就已經做完了。其實剖分很容易理解,但是問題是這樣做了有什么用呢?這個坑我們后面填~接下來先說說如何實現它。

        第一步當然是對于每個非葉子節點都要選取一條重邊以及重兒子,這就是重鏈的延伸方向。如你所想,用dfs很容易實現,依次遍歷該節點的子樹,然后挑選可達深度最大的點作為重兒子,具體代碼如下:

inline void dfs1(int u, int f, int d)			//u為當前節點,f為父親,d為當前深度{    dep[u] = d;						//先記下深度    size[u] = 1;					//size[]表示子樹的節點數目    son[u] = 0;						//son[]表示重兒子    fa[u] = f;    efor(i,u)						//遍歷子樹	{        int ff = g[i].y;        if (ff == f) continue;        dfs1(ff, u, d + 1);        size[u] += size[ff];        if (size[son[u]] < size[ff]) son[u] = ff;	//選取節點數最多的點作為重兒子    }}

        標記完重兒子后,我們要把每條鏈連起來,真正形成鏈。那么,我們用什么表示一條鏈呢?我們知道,樹狀數組、線段樹、平衡樹都是能支持在一段區間里維護性質,若我們能把一條鏈上的節點弄在一段連續的區間中,那我們就容易處理這些問題了。于是便想到了對每個節點進行重(chong)標號,一條鏈上的點的新編號一定是連續的,具體的還是利用dfs來實現,代碼:

inline void dfs2(int u, int tp)				//tp表示當前樹鏈的鏈頭,其實這個操作應該叫label{    top[u] = tp;					//top[]表示節點i所屬樹鏈的鏈頭,方便查詢和修改    id[u] = ++num;					//id[]表示一個節點新的id(編號)    Rank[id[u]]=u;					//Rank[]表示新編號i對應原來的編號,即Rank[id[i]]=i    if (son[u]) dfs2(son[u], tp);			//先對同一條鏈上的重兒子標號    efor(i,u)	{        int ff = g[i].y;        if (ff == fa[u] || ff == son[u]) continue;        dfs2(ff, ff);					//對其他兒子標號    }}

        這樣通過dfs1和dfs2,我們就完成了樹鏈剖分,現在開始填坑……

        樹鏈剖分適合解決樹上的一些修改詢問以及求LCA之類的問題,同過把樹進行剖分,我們可以用很多數據結構維護每一條鏈,然后再通過求LCA,我們可以解決對于樹上任意兩點的詢問問題。例如不斷的對邊權修改,求任意兩點之間的最大邊或最大值,這就可以用線段樹對每個樹鏈進行維護。另外,還值得一提的是樹鏈剖分后求LCA的方法,由于我們在dfs2的時候記錄了top[]數組,所以用樸素法就能很快的求出LCA,代碼:

inline int LCA(int u, int v){    int tp1 = top[u], tp2 = top[v];			//tp為鏈頭    while (tp1 != tp2)    {        if (dep[tp1] < dep[tp2])			//判斷深度	{            swap(tp1, tp2);            swap(u, v);        }        u = fa[tp1];					//每次向上走了tp1所以速度很快        tp1 = top[u];    }    return tp1;}

        令我不滿意的是,我好像還是沒有說清楚具體如何進行修改和查詢,好吧,下次結合具體的題目再說把,再給自己挖一個坑……

        最后說說我最不擅長的復雜度吧,由于是按照輕重鏈剖分的,所以有這樣的定理:

                1、對于輕邊(u,v),size[v]<=size[u]/2

                2、從根到某一點的路徑上,不超過logN條輕邊

                3、重鏈總數不超過logN

        因此剖分的時間復雜度為O(N);用數據結構去維護每一條鏈時,每次的時間復雜度為O(logN),當然你若不是用高級數據結構我也沒辦法咯=_=……,所以總的來說時間復雜度是O(NlogN)級別的。

        最后,我又看了一下百度,我覺的百科說的還是更有道理,樹鏈剖分是用來維護樹的路徑信息的一種算法?數據結構?我還是不來定義了……

        對了,那個坑我會填的^_^~~~


上一篇:13.2.1

下一篇:HDU-2222 Keywords Search

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频精品久久久| 亚洲欧美日韩直播| 欧美视频免费在线观看| 亚洲国产精彩中文乱码av在线播放| 欧美久久精品一级黑人c片| 日韩精品高清在线观看| 伊人久久久久久久久久久| 91成人天堂久久成人| 日韩国产在线播放| 国产美女精品视频免费观看| 91夜夜未满十八勿入爽爽影院| 北条麻妃一区二区在线观看| 国语对白做受69| 国内精品久久久久| 国产日韩欧美夫妻视频在线观看| 国产69精品久久久久9999| 欧美精品999| 精品国产91久久久久久| 精品国产一区二区三区在线观看| 亚洲男人天堂2023| 在线午夜精品自拍| 国产精品色视频| 日韩美女在线观看| 亚洲免费伊人电影在线观看av| 亚洲自拍偷拍区| 国产精国产精品| 日韩欧美国产黄色| 久久久久国产精品一区| 欧美高清视频在线观看| 精品人伦一区二区三区蜜桃网站| 午夜精品一区二区三区av| 亚洲高清不卡av| 91国自产精品中文字幕亚洲| 亚洲欧美在线第一页| 2019国产精品自在线拍国产不卡| 欧美激情视频一区二区| 午夜免费在线观看精品视频| 美女福利视频一区| 日韩av日韩在线观看| 亚洲美女黄色片| 欧美壮男野外gaytube| 久久久久久久网站| 欧美巨大黑人极品精男| 91亚洲精品久久久| 亚洲欧美中文日韩在线| 精品国产一区二区在线| 在线不卡国产精品| 欧美精品免费在线| 怡红院精品视频| 98精品国产高清在线xxxx天堂| 欧美第一页在线| 久久成人这里只有精品| 国产做受高潮69| 亚洲欧美制服中文字幕| 久久精品色欧美aⅴ一区二区| 成人h视频在线观看播放| 国产精品久久久久久中文字| 91中文在线观看| 日韩有码片在线观看| 中文字幕免费精品一区| 亚洲第一页中文字幕| 中文字幕免费精品一区| 国产精品久久9| 亚洲少妇激情视频| zzjj国产精品一区二区| 久久激情五月丁香伊人| 97婷婷涩涩精品一区| 亚洲精品视频中文字幕| 国产亚洲欧美一区| 亚洲有声小说3d| 69av在线视频| 97视频人免费观看| 国产成人精彩在线视频九色| 亚洲精品一区中文| 中文字幕亚洲专区| 91av视频在线免费观看| 国产日韩欧美在线看| 欧美又大粗又爽又黄大片视频| 不卡av日日日| 亚洲精品乱码久久久久久金桔影视| 欧美精品手机在线| 欧美激情第三页| 欧美成人免费在线视频| 色av吧综合网| 91最新在线免费观看| 亚洲一区999| 97在线视频精品| 精品一区二区三区电影| 精品欧美一区二区三区| 久久夜色撩人精品| 国产精品男女猛烈高潮激情| 欧美精品电影免费在线观看| 亚洲欧美日韩国产中文| 伊人久久男人天堂| 精品久久久久久久久中文字幕| 8x海外华人永久免费日韩内陆视频| 91深夜福利视频| 日本免费一区二区三区视频观看| 91精品中国老女人| 2019av中文字幕| 亚洲娇小xxxx欧美娇小| 亚洲男人第一av网站| 欧美在线一区二区视频| 久久大大胆人体| 91免费人成网站在线观看18| 欧美激情综合亚洲一二区| 91久久夜色精品国产网站| 欧美做受高潮1| 青青草成人在线| 国产精品视频自拍| 成人黄在线观看| 九九热这里只有在线精品视| 91免费高清视频| 中文日韩在线视频| 国产91精品视频在线观看| 在线观看精品自拍私拍| 欧美日韩国产成人| 一区二区欧美亚洲| 国产成人久久久精品一区| 亚洲欧美国产日韩天堂区| 日韩在线国产精品| 国产999精品久久久影片官网| 美女久久久久久久| 亚洲第一精品夜夜躁人人爽| 91黄色8090| 成人综合国产精品| 日韩中文有码在线视频| 日韩免费看的电影电视剧大全| 成人精品视频99在线观看免费| 国产精品成人观看视频国产奇米| 久久久精品一区| 欧美一区二区三区……| 最好看的2019年中文视频| 国产精品精品视频一区二区三区| 亚洲精品成人久久久| 欧美一区二区大胆人体摄影专业网站| 国内免费久久久久久久久久久| 国产精品久久一区主播| 国产精品日韩在线| 国产mv久久久| 91高清视频免费观看| 日韩精品中文字幕视频在线| 理论片在线不卡免费观看| 91网站在线看| 91理论片午午论夜理片久久| 欧美大片欧美激情性色a∨久久| 欧美精品第一页在线播放| 亚洲男人天堂2023| 91久久久久久久久久| 一区二区福利视频| 疯狂欧美牲乱大交777| 久久在线免费视频| 色综合五月天导航| 91亚洲一区精品| 亚洲第一区中文字幕| 2023亚洲男人天堂| 日本韩国欧美精品大片卡二| 欧美激情视频网| 国产主播喷水一区二区| 国产欧美最新羞羞视频在线观看| 中文字幕国产日韩| 欧美高清视频在线播放| 91久久嫩草影院一区二区| 超碰日本道色综合久久综合|