首页 > 其他 > 详细

P3379 【模板】最近公共祖先(LCA)

时间:2018-08-09 21:39:45      阅读:184      评论:0      收藏:0      [点我收藏+]

这题有毒!!!!!!!!!!

TM我重新打的板子,然而。。。。。。

5分钟打完 debug两小时

我的写法常数太大了

每次DFS都要For去更新F

最后写了快读才A

 

改:

只处理f[i][0]

dfs结束在处理f

整整快了一倍多!!!!!!!!

靠!!

 

烦。。。。

#include<cstdio>
#include<iostream>
using namespace std;
#define olinr return
#define love_nmr 0
#define nmr 505050
struct node
{
    int nxt,to;
}edge[nmr<<1];
int head[nmr];
int n;
int m;
int root;
int f[nmr][35];
int dep[nmr];
int cnt;
inline int read()
{
    char ch=getchar();
    int x=0,f=1;
    while(!isdigit(ch))
    {
        if(ch==-)
            f=-f;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    olinr x*f;
}
inline void put(int x)
{
    if(x<0)
    {
        putchar(-);
        x=-x;
    }
    if(x>9)
        put(x/10);
    putchar(x%10+0);
}
inline void add(int from,int to)
{
    cnt++;
    edge[cnt].to=to;
    edge[cnt].nxt=head[from];
    head[from]=cnt;
}
inline void dfs(int x,int depth)
{
    dep[x]=depth;
    for(int i=head[x];i;i=edge[i].nxt)
    {
        int go=edge[i].to;
        if(!dep[go])
        {
            dfs(go,depth+1);
            f[go][0]=x;
        }
    }
}
inline void swap(int &x,int &y)
{
    int t=x; x=y; y=t;
}
inline int LCA(int x,int y)
{
    if(dep[x]<dep[y]) swap(x,y);
    for(int i=30;i>=0;i--)
        if(dep[x]-(1<<i)>=dep[y])
            x=f[x][i];
    if(x==y) olinr x;
    for(int i=30;i>=0;i--)
        if(f[x][i]!=f[y][i])
        {
            x=f[x][i];
            y=f[y][i];
        }
    olinr f[x][0];
}

int main()
{
       n=read();
    m=read();
    root=read();
    int x,y;
    for(int i=1;i<=n-1;i++)
    {
        x=read();
        y=read();
        add(x,y);
        add(y,x);
    }
    dfs(root,1);
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i<=n;i++)
            f[i][j]=f[f[i][j-1]][j-1];
    for(int i=1;i<=m;i++)
    {
        x=read();
        y=read();
        put(LCA(x,y));
        putchar(\n);
    }
    olinr love_nmr;
} 

 

P3379 【模板】最近公共祖先(LCA)

原文:https://www.cnblogs.com/olinr/p/9451876.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!