请问这为什么会超时?
查看原帖
请问这为什么会超时?
1253499
Wang_Junduo楼主2024/7/19 11:56

C++语言

#include<bits/stdc++.h>
#define N 1000005
using namespace std;
struct edge
{
    int u,v,next;
}s[N];
int ecnt;
int head[N]={0},f[N][21],d[N];
void add(int u,int v)
{
    s[++ecnt].u=u;
    s[ecnt].v=v;
    s[ecnt].next=head[u];
    head[u]=ecnt;
}
void dfs(int u,int fa)
{
    f[u][0]=fa;
    d[u]=d[fa]+1;
    for(int i=1;(1<<i)<=d[u];i++)
        f[u][i]=f[f[u][i-1]][i-1];
    for(int i=head[u];i;i=s[i].next)
    {
        if(s[i].v!=fa)
            dfs(s[i].v,u);
    }
}
int lca(int x,int y)
{
    if(d[y]<d[x])
        swap(x,y);
    for(int i=5;i>-1;i--)
    {
        if(d[f[y][i]]<d[x])
            continue;
        y=f[y][i];
    }
    if(x==y)
        return x;
    for(int i=5;i>-1;i--)
    {
        if(f[x][i]==f[y][i])
            continue;
        y=f[y][i];
        x=f[x][i];
    }
    return f[x][0];
}
int main()
{
    int n,m,s;
    scanf("%d%d%d",&n,&m,&s);
    int u,v;
    for(int i=1;i<=n-1;i++)
    {
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    for(int i=1;i<=m;i++)
    {
        int j,z;
        scanf("%d%d",&j,&z);
        dfs(s,0);
        printf("%d\n",lca(j,z));
    }
    return 0;
}

已经用了scanf,printf了

2024/7/19 11:56
加载中...