10.24 div2——第三题

Правка en1, от cmkpjjnh, 2026-10-24 16:31:20

思路很简单,子树不同分支 没学lca,但是这题有明确主干,就是直接找公共祖先在主干上的点而且不是1 没有必要连上再减去一部分,直接全局算距离 树一般默认无向,无语,因为这个一直错 !!!没必要思考怎么连这个树,加边减边很难做,直接全局变量考虑

include<bits/stdc++.h>

using namespace std;

define int long long

const int N=5e5+10; vectorg[N]; int par[N],dep[N]; bool ok[N]; int f[N]; void dfs1(int u,int p,int d) { par[u]=p; dep[u]=d; for(int v:g[u]) { if(v!=p) { dfs1(v,u,d+1); } } } void dfs2(int u,int p) { if(u!=1) { f[u]=ok[u]?u:f[p]; } for(int v:g[u]) { if(v!=p) { dfs2(v,u); } } } void solve() { int n,m;cin>>n>>m; for(int i=1;i<=n;i++) { g[i].clear(); par[i]=0;dep[i]=0; ok[i]=false;f[i]=0; } int t=n-1; while(t--) { int a,b;cin>>a>>b; g[a].push_back(b); g[b].push_back(a); } dfs1(1,0,0); for(int i=n;i!=0;i=par[i]) { ok[i]=true; } f[1]=1; dfs2(1,0); int ans=dep[n]; while(m--) { int x;cin>>x; if(!ok[x]&&f[x]!=1) { ans=max(ans,dep[x]+dep[n]-dep[f[x]]*2+1); } } cout<<ans<<'\n'; } signed main() { ios::sync_with_stdio(false); cin.tie(0); int t;cin>>t; while(t--) { solve(); } return 0; }

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
en2 Английский cmkpjjnh 2026-10-24 16:34:51 12
en1 Английский cmkpjjnh 2026-10-24 16:31:20 1160 Initial revision (published)