倍增LCA模板

来源:互联网 发布:灵格斯mac版 编辑:程序博客网 时间:2024/06/06 02:27
void dfs(int u) {     int i;     for(i=head[u];i!=-1;i=next[i]) {         if (!deep[to[i]]) {            deep[to[i]] = deep[u]+1; p[to[i]][0] = u;           //p[x][0]保存x的父节点为u;            dfs(to[i]);        }    } }void init() {     int i,j; //p[i][j]表示i结点的第2^j祖先        for(j=1;(1<<j)<=n;j++)             for(i=1;i<=n;i++)                 if(p[i][j-1]!=-1) p[i][j]=p[p[i][j-1]][j-1];          //i的第2^j祖先就是i的第2^(j-1)祖先的第2^(j-1)祖先 }int lca(int a,int b) {//最近公共祖先     int i,j;     if(deep[a]<deep[b])swap(a,b);     for(i=0;(1<<i)<=deep[a];i++); i--;     for(j=i;j>=0;j--) //使a,b两点的深度相同         if(deep[a]-(1<<j)>=deep[b]) a=p[a][j];     if(a==b)return a;     for(j=i;j>=0;j--) {         if(p[a][j]!=-1&&p[a][j]!=p[b][j]) {             a=p[a][j]; b=p[b][j];         }    }     return p[a][0]; }

原创粉丝点击