vue路由的基本使用
阿新 • • 發佈:2022-05-09
倍增求LCA
錯誤的\(dfs\)
void dfs(int u,int fa){ dep[u]=dep[fa]+1; f[u][0]=fa; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(v==fa)continue; dfs(v,u); } for(int i=1;(1<<i)<=dep[u];++i){ f[u][i]=f[f[u][i-1]][i-1]; } }
正確的\(dfs\)
void dfs(int u,int fa){ dep[u]=dep[fa]+1; for(int i=1;(1<<i)<=dep[u];++i){ f[u][i]=f[f[u][i-1]][i-1]; } for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(v==fa){ continue; } f[v][0]=u; dfs(v,u); } }
唯一的區別在於什麼時候處理\(f\)陣列,錯誤的碼在葉子節點處理,但是顯然葉子節點往上的節點都沒有值,這樣遞推\(f\)中應該大部分都是錯誤的(然而在一些小資料中體現的不明顯,所以我一直這麼錯還一直懷疑資料的鍋)
倍增求LCA
\(O(\log n)\)
int Lca(int u,int v){ if(dep[u]<dep[v])swap(u,v); int len=dep[u]-dep[v],k=0; while(len){ if(len&1){ u=f[u][k]; } len>>=1;k++; } if(u==v)return u; for(int i=20;i>=0;--i){ if(f[u][i]!=f[v][i]){ u=f[u][i]; v=f[v][i]; } } return f[u][0]; }
另外還有ST表RMQ,樹鏈剖分的求法,請到其他大佬的部落格學習