1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| #include<bits/stdc++.h> using namespace std; const int maxn=5e5+5; int n,m;
struct Edge { int v; int nex; } e[maxn*2];
int head[maxn],dep[maxn],f[maxn][21];
int cnt=0;
void add(int u,int v) { e[++cnt].v=v; e[cnt].nex=head[u]; head[u]=cnt; }
void dfs(int u,int fa) { dep[u]=dep[fa]+1; f[u][0]=fa; for(int i=1; (1<<i)<=dep[u]; i++) { f[u][i]=f[f[u][i-1]][i-1]; } for(int i=head[u]; i!=-1; i=e[i].nex) { int v=e[i].v; if(v!=fa) { dfs(v,u); } } } int lca(int x,int y) { if(dep[x]>dep[y]) { swap(x,y); } for(int i=20; i>=0; i--) { if(dep[x]<=dep[y]-(1<<i)) { y=f[y][i]; } } if(x==y) { return x; } for(int i=20; i>=0; i--) { if(f[x][i]==f[y][i]) { continue; } else { x=f[x][i]; y=f[y][i]; } } return f[x][0]; } struct Tree { int right; int left; int fa; int dep; int data; } t[25000]; int x,y,ans,sum[1000]; int main() { memset(head,-1,sizeof(head)); scanf("%d",&n); t[1].dep=1; t[1].fa=0; for(int i=1; i<=n-1; i++) { scanf("%d%d",&x,&y); add(x,y); add(y,x); if(t[x].left==0) { t[x].left=y; } else { t[x].right=y; } t[y].fa=x; t[y].dep=t[x].dep+1; if(t[y].dep>ans) { ans=t[y].dep; } } dfs(1,0); for(int i=1; i<=n; i++) { sum[t[i].dep]++; } sort(sum+1,sum+1+n); cout<<ans<<endl; cout<<sum[n]<<endl; int a,b; scanf("%d%d",&a,&b); int res=lca(a,b); cout<<(t[a].dep-t[res].dep)*2+t[b].dep-t[res].dep; }
|