#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+1;
int n,A,B;
int depth[maxn];
vector<vector<int> > adj(maxn);
vector<int> pat;
bool pripagja[maxn];
int dp[maxn];
bool dfs(int p,int pret)
{
pat.push_back(p);
if (p == B) return true;
for (auto a: adj[p]){
if (a != pret && dfs(a,p)) return true;
}
pat.pop_back();
return false;
}
int zab;
int f(int p,int pret)
{
if (adj[p].size() == 1 && adj[p][0] == pret) return 0;
if (pripagja[p]==false && dp[p]>0) return dp[p];
vector<int> v;
for (auto s: adj[p]){
if (s == pret || (p == pat[zab] && s == pat[zab+1]) || (p == pat[zab+1] && s == pat[zab])) continue;
v.push_back(f(s,p));
}
sort(v.begin(),v.end());reverse(v.begin(),v.end());
int ans = 0;
for (int i=0; i <v.size();i++) ans = max(ans,v[i]+i+1);
//cout<<endl<<p<<" vrakja "<<ans<<endl;
dp[p] = ans;
return ans;
}
int ts(int l,int r)
{
//cout<<l<< " "<<r<<endl;
if (l == r) return r;
int ml = (l+l+r)/3;
int mr = (l+r+r)/3;
zab = ml;
int op1 = max(f(A,0), f(B,0));
zab = mr;
int op2 = max(f(A,0), f(B,0));
if (op1<op2) return ts(ml+1,r);
else return ts(l,mr-1);
}
int main()
{
cin>>n>>A>>B;
for (int i=0;i<n-1;i++){
int a,b;
cin>>a>>b;
adj[a].push_back(b);
adj[b].push_back(a);
}
dfs(A,0);
//for (auto a: pat) cout<<a<<" ";
for (auto a: pat) pripagja[a] = true;
int ans = 1e7;
for (int i=0;i<pat.size()-1;i++){
//zab = ts(0,pat.size()-1);
zab = i;
// cout<<"zabraneto e "<<
int x = f(A,0),y = f(B,0);
ans = min(ans,max(x,y));
//cout<<"x = "<<x<<" y="<<y<<endl;
}
cout<<ans;
// zab = ts(0,pat.size()-2);
// cout<<max(f(A,0),f(B,0))<<endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |