洛谷P4281 【[AHOI2008]紧急集合 / 聚会】
LCA题目 这题不就是改成三个点的LCA吗? 首先求出三个点中两两的LCA,如果有两个LCA相等,那么三个点的LCA就是另外那对点的LCA int fa1=lca(u,v),fa2=lca(v,w),fa3=lca(w,u); if(fa1==fa2)printf("%d ",fa3); if(fa2==fa3)printf("%d ",fa1); if(fa3==fa1)printf("%d ",fa2); 最后三个点深度和减去三个LCA的深度和就是金币数 看着他这么水就马上把代码 从我博客里弄下来改一改 交上去 #include<bits/stdc++.h> using namespace std; struct edge{ int to,next; }ed[100005]; int n,m,u,v,w,cnt,head[50005],dep[50005],f[50005][20]; void add(int u,int v){ cnt++; ed[cnt].to=v; ed[cnt].next=head[u]; head[u]=cnt; } void dfs(int u,int fa){ f[u][0]=fa; dep[u]=dep[fa]+1; for(int i=1;i<20;i++)f[u][i]=f[f[u][i-1]][i-1]; for(int i=head[u]