求助Tarjan求lca为何没法过
查看原帖
求助Tarjan求lca为何没法过
246331
mystic_qwq楼主2024/4/4 15:25
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=5e4+5;
vector<int> Q[N],G[N];
int lca,n,m,vis[N],p[N],C,siz[N],sc=0x7fffffff,mx1,fa[N];
void getcentre(int,int);
void add(int,int);
void addQuery(int,int);
int find(int);
void dfs(int u){
  fa[u]=u,vis[u]=1;
  for(int v:G[u])
    if(!vis[v]) dfs(v),fa[v]=u;
  for(int v:Q[u])
    if(vis[v]) lca=find(v),++p[u],++p[v],--p[lca],--p[fa[lca]];
}
int dfs1(int u,int Fa){
  for(int v:G[u])
    if(v!=Fa) p[u]+=dfs1(v,u);
  mx1=max(mx1,p[u]);
  return p[u];
}
main(){
  cin.tie(0)->sync_with_stdio(0);
  cin>>n>>m;
  for(int i=1,x,y;i<n;++i)
    cin>>x>>y,add(x,y);
  getcentre(1,0);
  G[0].pb(C);
  for(int x,y;m--;)
    cin>>x>>y,addQuery(x,y);
  dfs(0),dfs1(C,0),cout<<mx1;
}
void getcentre(int u,int Fa){
  siz[u]=1;
  int mx=0;
  for(auto v:G[u]){
    if(v==Fa) continue;
    getcentre(v,u),siz[u]+=siz[v];
    mx=max(siz[v],mx);
  }
  mx=max(n-siz[u],mx);
  if(mx<sc||(mx==sc&&u<C))C=u,sc=mx;
}
void addQuery(int u,int v){
  Q[u].pb(v),Q[v].pb(u);
}
void add(int u,int v){
  G[u].pb(v),G[v].pb(u);
}
int find(int x){
  if(x==fa[x]) return x;
  return fa[x]=find(fa[x]);
}

而倍增却直接过了,甚至重心都没求

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int n,m,s,f[N][19],g[N][19],dep[N],p[N],mx;
vector<int>G[N];
void dfs(int u,int fa){
  for(int v:G[u])
    if(v!=fa) f[v][0]=u,dep[v]=dep[u]+1,dfs(v,u);
}
void init(){
  for(int j=1;(1<<j)<=n;++j)
    for(int i=1;i<=n;++i)
      f[i][j]=f[f[i][j-1]][j-1]; 
}
int LCA(int u,int v){
  if(dep[v]>dep[u]) swap(u,v);
  for(int x=dep[u]-dep[v],n;x;)
    n=log2(x),u=f[u][n],x-=(1<<n);
  //for(int i=log2(n);~i;--i)
    //if(dep[f[u][i]]>=dep[v]) u=f[u][i];
  if(u==v) return v;
  for(int j=log2(n);~j;--j)
    if(f[u][j]!=f[v][j]) u=f[u][j],v=f[v][j];
  return f[u][0];
}
void Add(int x,int y){
  G[x].push_back(y);
  G[y].push_back(x);
}
int dfs1(int u,int fa){
  for(int v:G[u])if(v!=fa)p[u]+=dfs1(v,u);
  mx=max(mx,p[u]); return p[u];
}
main(){
  //freopen("P3128_2.in","r",stdin);
  cin.tie(0)->sync_with_stdio(0);
  cin>>n>>m,s=1;
  for(int i=1,x,y;i<n;++i)
    cin>>x>>y,Add(x,y);
  dfs(s,0),init();
  for(int a,b,lca;m--;)
    cin>>a>>b,lca=LCA(a,b),++p[a],++p[b],--p[lca],--p[*f[lca]];
  dfs1(1,0),cout<<mx;
}
2024/4/4 15:25
加载中...