Tarjan算法求LCA

待更新......

先把代码贴上

#include<bits/stdc++.h>
using namespace std;
const int maxn=500000*2+10;
int head[maxn],tot=0,ver[maxn],nxt[maxn];
int headq[maxn],totq=1,verq[maxn],nxtq[maxn];
int ans[maxn],f[maxn];
bool vis[maxn];
void add(int x,int y)
{
    ver[++tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
    return;
}
void addq(int x,int y)
{
    verq[++totq]=y;
    nxtq[totq]=headq[x];
    headq[x]=totq;
    return;
}
int getf(int x) {return x==f[x]?x:f[x]=getf(f[x]);}
void merge(int t1,int t2)
{
    t1=getf(t1);t2=getf(t2);
    if(t1==t2)return;
    f[t1]=t2;
    return;
}
void tarjan(int x,int l)
{
    for(int e=head[x];e;e=nxt[e])
    {
        if(ver[e]!=l)
        {
            tarjan(ver[e],x);
            merge(ver[e],x);
            vis[ver[e]]=true;
        }
        for(int i=headq[x];i>1;i=nxtq[i])
            if(vis[verq[i]])
                ans[i>>1]=getf(verq[i]);
    }
}
int main()
{
    int n,m,s;
    scanf("%d %d %d",&n,&m,&s);
    for(int i=1;i<=n;i++) f[i]=i;
    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);
        addq(x,y);
        addq(y,x);
    }
    tarjan(s,0);
    for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
    return 0;
}
上一篇:[洛谷P6185] [NOI online 提高]T1 序列


下一篇:Kruskal重构树学习笔记