鍊嶅鍏ラ棬

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了鍊嶅鍏ラ棬相关的知识,希望对你有一定的参考价值。

鏍囩锛?a href='http://www.mamicode.com/so/1/%e4%b8%80%e6%ae%b5' title='涓€娈?>涓€娈?/a>   鍏叡绁栧厛   鍖洪棿鍚堝苟   鏂规硶   span   閫掓帹鍏紡   inline   class   閫掓帹   

鍊嶅

绾挎€у€嶅

(f[i][j])琛ㄧず浠?span class="math inline">(i)寮€濮嬬殑闀垮害涓?span class="math inline">(2^{j})鐨勫尯闂达紙鍗冲尯闂?span class="math inline">([i, i+2^{j}-1])锛?/p>

閫掓帹鍏紡锛坖鍦ㄥ灞傞€掑锛夛細

(f[i][j]=max{f[i][j-1], f[i+2^{j-1}][j-1]})

鍗冲皢鍖洪棿([l, r])鍒嗕负涓や釜鍖洪棿鍚堝苟

鏌ヨ

鍒嗕负涓ゆ锛岀涓€娈典负鍖洪棿([l, k])锛岀浜屾涓哄尯闂?span class="math inline">([r-k+1, r])锛屽叾涓?span class="math inline">(k)涓烘弧瓒?span class="math inline">(2^{k}le r-l+1)鐨勬墍鏈夋暟涓渶澶х殑閭d釜鏁?/p>

(f[i][j]=max{f[i][k], f[j-2^{k}+1][j]})

鏍戜笂鍊嶅锛堟眰瑙CA锛?/h2>

棰勫鐞?/h3>

棣栧厛缁撳悎dfs棰勫鐞嗗嚭(f[i][j])锛?span class="math inline">(f[i][j])琛ㄧず鑺傜偣(i)鍚戜笂璺?span class="math inline">(2^{j})灞傜殑鑺傜偣

閫掓帹鍏紡锛?/p>

(f[i][j]=f[f[i][j-1]][j-1])

鍗宠妭鐐?span class="math inline">(i)鍒嗕袱娆″悜涓婅烦锛屾瘡娆¤烦(2^{j-1})灞傝烦鍒扮殑鑺傜偣灏辨槸鑺傜偣(i)鍚戜笂璺?span class="math inline">(2^{j})灞傜殑鑺傜偣锛?span class="math inline">(2^{j-1} imes 2=2^{j})锛?/p>

void dfs(int x, int fa){
    dep[x]=dep[fa]+1;
    f[x][0]=fa;
    for(int j=1;(1<<j)<=dep[x];j++)
        f[x][j]=f[f[x][j-1]][j-1];
    for(int i=0;i<mp[x].size();i++)
        if(mp[x][i]!=fa)
            dfs(mp[x][i], x);
}

鍚屾椂涔熷彲浠ラ『渚块澶勭悊鍑?span class="math inline">(log^{n}_{2})鐨勬墍鏈夊€间互浼樺寲甯告暟

鏌ヨ

棣栧厛浣夸袱涓煡璇㈣妭鐐硅烦鑷冲悓涓€楂樺害鍚庯紙鍥犱负瀹冧滑鐨勬渶杩戝叕鍏辩鍏堜笉鍙兘浣庝簬杩欎袱鐐癸紝璺宠穬鏂规硶鍚屼笅锛夛紝褰撳墠灞傝涓?span class="math inline">(x)锛岀劧鍚庝粠(log^{x}_{2})鍒?鏋氫妇锛堥€掑噺鑳戒繚璇佸彲浠ュ畬鍏ㄥ垎瑙f垚浜岃繘鍒讹級(j)锛屽鏋滀笂璺?span class="math inline">(2^{j})灞傚悗涓嶉噸鍚堬紝閭d箞灏辩户缁烦锛岄噸鍚堝垯涓嶈烦锛屼娇涓ょ偣灞傛暟涓€鐩撮€艰繎鏈€杩戝叕鍏辩鍏堬紝鏈€鍚庤烦瀹?span class="math inline">(2^{0})灞傚悗锛屼袱鐐瑰繀瀹氫細鍋滃湪鏈€杩戝叕鍏辩鍏堢殑涓嬩竴灞傦紝鎵€浠ユ渶鍚庣洿鎺ュ彇褰撳墠灞?span class="math inline">(i)鐨?span class="math inline">(f[i][0])灏卞ソ浜嗐€?/p>

鍏朵腑锛屾瘡娆″彇寰梜鐨?code>while((1<<t)<=dep[a])寰幆鍙互濡傚墠鏂囨彁鍒扮殑閭f牱鍏堟墦琛ㄥ嚭(log^{n}_{2})鐨勬墍鏈夊€间互浼樺寲甯告暟

int lca(int a, int b){
    if(dep[a]<dep[b])
        swap(a,b);
    int t=0;
    if(dep[a]!=dep[b]){
        while((1<<t)<=dep[a]) t++;    t-=1;
        for(int i=t;i>=0;i--){
            if(dep[a]-(1<<i)>=dep[b])
                a=f[a][i];
        }
    }
    if(a==b)    return a;
    t=0;
    while((1<<t)<=dep[a]) t++;    t-=1;
    for(int i=t;i>=0;i--)
        if(f[a][i]!=f[b][i])
            a=f[a][i], b=f[b][i];
    return f[a][0];
}

以上是关于鍊嶅鍏ラ棬的主要内容,如果未能解决你的问题,请参考以下文章

Java鍏ラ棬(鍩虹绡囦竴)

mybatis鍏ラ棬

JavaPoet鍏ラ棬

cmake鍏ラ棬

Shiro鍏ラ棬

Flutter鍏ラ棬鍩虹