zoukankan      html  css  js  c++  java
  • LOJ #10130 点的距离

    在LOJ做的第一道题。

    最开始想复杂了qwq 想的是在求LCA的过程中统计向上的步数

    其实此题很裸……就是求出u,v的LCA,

    再分别用两点深度减去LCA的深度,再加起来就好了qwq
    ---化简---
    (dep[u]+dep[v]-2*dep[LCA(u,v)])

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #define MAXN 100005
    using namespace std;
    struct qwq
    {
    	int t,nex;
    };
    int tot=0,dep[MAXN],fa[MAXN][20],lg[MAXN],h[MAXN],n,m;
    qwq e[MAXN<<1];
    inline void add(int x,int y)
    {
    	e[++tot].t=y;
    	e[tot].nex=h[x];
    	h[x]=tot;
    }
    void dfs(int f,int fat)
    {
    	dep[f]=dep[fat]+1;
    	fa[f][0]=fat;
    	for (int i=1;(1<<i)<=dep[f];i++)
    	{
    		fa[f][i]=fa[fa[f][i-1]][i-1];
    	}
    	for (int i=h[f];i>0;i=e[i].nex)
    	{
    		if (e[i].t!=fat)
    		{
    			dfs(e[i].t,f);
    		}
    	}
    }
    int LCA(int x,int y)
    {
    	if (dep[x]<dep[y])
    	{
    		swap(x,y);
    	}
    	while (dep[x]>dep[y])
    	{
    		x=fa[x][lg[dep[x]-dep[y]]-1];
    	}
    	if (x==y)
    	{
    		return x;
    	}
    	for (int i=lg[dep[x]-1];i>=0;i--)
    	{
    		if (fa[x][i]!=fa[y][i])
    		{
    			x=fa[x][i];
    			y=fa[y][i];
    		}
    	}
    	return fa[x][0];
    }
    int maxn=-10;
    inline void init()
    {
    	scanf("%d",&n);
    	for (int i=1,x,y;i<n;i++)
    	{
    		scanf("%d%d",&x,&y);
    		maxn=max(maxn,max(x,y));
    		add(x,y);
    		add(y,x);
    	}
    	for (int i=1;i<=n;i++)
    	{
    		lg[i]=lg[i-1]+(1<<lg[i-1]==i);
    	}
    	dfs(maxn,0);
    	scanf("%d",&m);
    	for (int i=1,x,y;i<=m;i++)
    	{
    		scanf("%d%d",&x,&y);
    		int lca=LCA(x,y);
    		printf("%d
    ",dep[x]+dep[y]-2*dep[lca]);
    	}
    }
    int main()
    {
    	init();
    	return 0;
    }
    
  • 相关阅读:
    20201220第二周学习总结
    师生关系
    快速浏览教材
    学期2020-2021-1学号20201220《信息安全专业导论》第1周学习总结
    编程将字符串s倒序输出,要求利用函数递归实现
    小学生四则运算随机生成程序
    礼炮问题
    C语言最大公约数
    C语言判断三角形类型
    C语言:一元二次方程解的所有情况
  • 原文地址:https://www.cnblogs.com/Kan-kiz/p/10620531.html
Copyright © 2011-2022 走看看