P4281 [AHOI2008]紧急集合 / 聚会

P4281 [AHOI2008]紧急集合 / 聚会


军训完。发现我自己连lca版都不会了

然后就强行写了这个题

然后卡了两天的原因就是计算距离写错了

#include<cstdio> 
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
using std::swap;
using std::abs;
const int maxn=501000;
struct node
{
    int p;
    int nxt;
};
node line[maxn<<1];
int head[maxn],tail;
int st[maxn][30],Log[maxn];
int dep[maxn];
void add(int a,int b)
{
    line[++tail].p=b;
    line[tail].nxt=head[a];
    head[a]=tail; 
}
void dfs(int now,int f)
{
    st[now][0]=f;
    dep[now]=dep[f]+1;
    for(int i=1;i<=Log[dep[now]];i++)
        st[now][i]=st[st[now][i-1]][i-1];
    for(int i=head[now];i;i=line[i].nxt)
        if(line[i].p!=f)
            dfs(line[i].p,now);
}
int Lca(int a,int b)
{
    if(dep[a]<dep[b])   swap(a,b);
    for(int i=Log[dep[a]];i>=0;i--)
        if(dep[st[a][i]]>=dep[b])
            a=st[a][i];
    if(a==b)    return a;
    for(int i=Log[dep[a]];i>=0;i--)
        if(st[a][i]!=st[b][i])
            a=st[a][i],b=st[b][i];
    return st[a][0];
}
int dist(int lca,int a,int b,int c)
{
    return abs(dep[lca]-dep[a])+abs(dep[lca]-dep[b])+abs(dep[lca]-dep[c]);
}
void solve(int a,int b,int c)
{
    int lca1=Lca(a,b),lca2=Lca(a,c),lca3=Lca(b,c);
    if(lca1==lca2)
        printf("%d ",lca3);
    else if(lca1==lca3)
        printf("%d ",lca2);
    else if(lca2==lca3)
        printf("%d ",lca1);
    printf("%d\n",dep[a]+dep[b]+dep[c]-dep[lca1]-dep[lca2]-dep[lca3]);//就是这个鬼地方
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=2;i<=n;i++)   Log[i]=Log[i>>1]+1;
    int a,b,c;
    for(int i=1;i<n;i++) 
    {
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
    }
    dfs(1,0);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        solve(a,b,c);
    }
}

猜你喜欢

转载自www.cnblogs.com/Lance1ot/p/9579857.html