首页 > 其他分享 >点权LCA

点权LCA

时间:2022-11-13 16:16:05浏览次数:34  
标签:1000010 int 点权 dep edge LCA now dis

https://www.luogu.com.cn/problem/P8805 模板题

//点权LCA

#include<bits/stdc++.h>
using namespace std;
int t,idx,n,m;
int dep[1000010],f[1000010][30],head[1000010],du[1000010],dis[1000010];
struct node{
int nxt,to;
}edge[1000010];
void add(int u,int v)
{
edge[++idx].nxt=head[u];
edge[idx].to=v;
head[u]=idx;
}
void dfs(int now,int fath)
{
dep[now]=dep[fath]+1;
dis[now]+=du[now];
f[now][0]=fath;
for(int i=1;i<=t;i++)
{
f[now][i]=f[f[now][i-1]][i-1];
}
for(int i=head[now];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(v==fath)
continue;
dis[v]+=dis[now];
dfs(v,now);
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y])
{
swap(x,y);
}
for(int i=t;i>=0;i--)
{
if(dep[f[x][i]]>=dep[y])
{
x=f[x][i];
}
}
if(x==y)
return x;
for(int i=t;i>=0;i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int main()
{
cin>>n>>m;
t=(int)(log(n)/log(2))+1;
for(int i=1;i<=n-1;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
du[u]++,du[v]++;
}
dfs(1,-1);
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
int lca=LCA(x,y);
printf("%d\n",dis[x]+dis[y]-dis[lca]-dis[f[lca][0]]);
}
return 0;
}

标签:1000010,int,点权,dep,edge,LCA,now,dis
From: https://www.cnblogs.com/wqy2003/p/16886131.html

相关文章

  • [Typescript] 99. Hard - CamelCase
    Implement CamelCase<T> whichconverts snake_case stringto camelCase.ForexampletypecamelCase1=CamelCase<'hello_world_with_types'>//expectedtobe......
  • P3379 【模板】最近公共祖先(LCA)tarjan算法
    tarjan算法求LCA//tarjan算法#include<bits/stdc++.h>usingnamespacestd;constintmaxn=5e5+10;vector<int>tre[maxn];structnode{ intto; intid;};vect......
  • vue fullcalendar月周日历
    参考https://fullcalendar.io/demoshttps://www.cnblogs.com/czk1634798848/p/13386178.htmlhttps://blog.csdn.net/qq_39863107/article/details/105387879引入了Day.......
  • 树的点权
    问题描述给定一棵有n个点的树(点的编号为1~n),根为1,点有点权,设点i的初始值为0,给出q个操作,每个操作给出两个点和一个值,u,v,t,表示将u到v的路径上的所有点加t,输出所有操作后每......
  • 【luogu P1600】天天爱跑步(线段树合并)(LCA)
    天天爱跑步题目链接:luoguP1600题目大意有一棵树,给你若干条路径,对于每个点,有一个数x,求出有多少条路径的第x个点是当前点。思路考虑把路径拆成两个部分,向上和向下。......
  • LCA 的四种求法,你都会了吗?
    回字有四样写法,你知道么?lca,即最近公共祖先,如上图中2和13的lca是1,5和6的lca是2。众所周知,LCA的主流求法有4种。那么,你都会了吗?树链剖分如果你不会......
  • 【XSY2485】MST(最小生成树+倍增lca+并查集)
    题面Description给定一个\(n\)个点\(m\)条边的连通图,保证没有自环和重边。对于每条边求出,在其他边权值不变的情况下,它能取的最大权值,使得这条边在连通图的所有最小生成......
  • 【XSY2414】【CF587C】Duff in the Army(倍增lca)
    看到题目中\(a<=0\),自然就想到用暴力维护这个东东。设倍增数组\(fa[u][i]\)和\(minn[u][i]\),其中\(minn\)存的是一个结构体,结构体中包含两个东东:一个数组和这个数组中的元......
  • LCA
    倍增算法预处理O(nlogn)单次询问O(logn)voiddfs(intu,intfa){ for(inti=hd[u];i;i=g[i].nxt) { intv=g[i].to; if(v==fa) continue; d......
  • 【Vue】fullcalendar - next ,prev切换回调处理
    如(4条消息)fullcalendar-next,prev等切换月份回调处理_Q.E.D.的博客-CSDN博客_fullcalendarprev这篇博客所说,fullcalendarnext,prev等切换月份的按钮是没有回调函......