标签:mss hid str space ret isp ring ack ++
这道题只要求出点集的直径,答案就是直径的上取整一半
#include<iostream> #include<algorithm> #include<stack> #include<vector> #include<cstring> #include<cstring> #include<queue> using namespace std; typedef long long ll; const int N=3e5+10; const int mod=1e9+7; int depth[N]; int fa[N][21]; int pos[N]; struct node{int v,nxt;}ed[N<<1]; int head[N],tot; void add(int x,int y){ed[++tot]={y,head[x]};head[x]=tot;}; void dfs(int x,int y){ fa[x][0]=y; for(int i=1;i<=20;i++){ fa[x][i]=fa[fa[x][i-1]][i-1]; } for(int i=head[x];i;i=ed[i].nxt){ int v=ed[i].v; if(v==y) continue; depth[v]=depth[x]+1; dfs(v,x); } } int lca(int a,int b){ if(depth[a]<depth[b]) swap(a,b); int i; for(i=20;i>=0;i--){ if(depth[fa[a][i]]>=depth[b]){ a=fa[a][i]; } } if(a==b) return a; for(i=20;i>=0;i--){ if(fa[a][i]!=fa[b][i]){ a=fa[a][i]; b=fa[b][i]; } } return fa[a][0]; } int main(){ int n; cin>>n; int i; for(i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); } dfs(1,1); int q; cin>>q; while(q--){ int num; cin>>num; int flag=0; int u; for(i=1;i<=num;i++){ scanf("%d",&pos[i]); if(depth[pos[i]]>flag){ flag=depth[pos[i]]; u=pos[i]; } } int ans=0; for(i=1;i<=num;i++){ int p=lca(u,pos[i]); ans=max(ans,depth[u]+depth[pos[i]]-2*depth[p]); } printf("%d\n",(ans+1)/2); } }
标签:mss hid str space ret isp ring ack ++
原文地址:https://www.cnblogs.com/ctyakwf/p/12588899.html