鍊嶅鍏ラ棬
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];
}
以上是关于鍊嶅鍏ラ棬的主要内容,如果未能解决你的问题,请参考以下文章