1. 程式人生 > 其它 >vue路由的基本使用

vue路由的基本使用

倍增求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,樹鏈剖分的求法,請到其他大佬的部落格學習