模板--------LCA

来源:互联网 发布:javascript复选框全选 编辑:程序博客网 时间:2024/06/11 10:43

倍增法求LCA,在线算法:

#include<iostream>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>using namespace std;struct mc{int x,y,ne;}e[1000010];int num=0,v[500010];void put(int x,int y){num++;e[num].x=x;e[num].y=y;e[num].ne=v[x];v[x]=num;}int f[500010][21],d[500010];void dfs(int x,int father,int deep){f[x][0]=father;d[x]=deep;for (int i=v[x];i;i=e[i].ne){int y=e[i].y;if(y!=father)dfs(y,x,deep+1);}}int n,m,s;void pre(){for (int j=1;j<=20;j++)  for (int i=1;i<=n;i++)    f[i][j]=f[f[i][j-1]][j-1];}int LCA(int x,int y){if (d[x]<d[y]) swap(x,y);int k=log(n)/log(2)+1;for (int i=20;i>=0;i--){if (d[f[x][i]]>=d[y])x=f[x][i];}if (x==y) return x;k=log(x)/log(2)+1;for (int i=20;i>=0;i--){if (f[x][i]!=f[y][i]){x=f[x][i];y=f[y][i];}}return f[x][0];}int main(){int x,y;scanf("%d%d%d",&n,&m,&s);for (int i=1;i<n;i++){scanf("%d%d",&x,&y);put(x,y);put(y,x);}dfs(s,0,1);pre();for (int i=1;i<=m;i++){scanf("%d%d",&x,&y);printf("%d\n",LCA(x,y));}return 0;}


0 0
原创粉丝点击