LCA (Tarjan)

来源:互联网 发布:怎么看淘宝代购真假 编辑:程序博客网 时间:2024/06/16 18:38

感谢两位大佬的博客,讲得很明白。
%dalao
%dalao
模板
评测传送

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#define LL long long #define M 750009 using namespace std;int head[M],to[2*M],nxt[2*M],tt;int qhead[M],qto[2*M],qnxt[2*M],qtt,lca[2*M];int f[M];int n,m,root;bool vis[M];void add(int x,int y){    to[++tt]=y;    nxt[tt]=head[x];    head[x]=tt;}void qadd(int x,int y){    qto[++qtt]=y;    qnxt[qtt]=qhead[x];    qhead[x]=qtt;}int find(int x){    return f[x]==x?x:f[x]=find(f[x]); }void dfs(int x){    f[x]=x;    vis[x]=1;    for(int i=head[x];i;i=nxt[i])    if(!vis[to[i]])    {        dfs(to[i]);        f[to[i]]=x;    }    for(int i=qhead[x];i;i=qnxt[i])    if(vis[qto[i]])    {        lca[i]=find(qto[i]);        if(i%2) lca[i+1]=lca[i];        else lca[i-1]=lca[i];    }}int main(){    scanf("%d%d%d",&n,&m,&root);    for(int i=1;i<n;i++)    {        int x,y;        scanf("%d%d",&x,&y);        add(x,y);add(y,x);    }    for(int i=1;i<=m;i++)    {        int x,y;        scanf("%d%d",&x,&y);        qadd(x,y);qadd(y,x);    }    dfs(root);    for(int i=1;i<=m;i++)     printf("%d\n",lca[i*2]);    return 0;}