Submission #584897

#TimeUsernameProblemLanguageResultExecution timeMemory
584897amunduzbaevMousetrap (CEOI17_mousetrap)C++17
45 / 100
823 ms77260 KiB
#include "bits/stdc++.h"
using namespace std;
 
#define ar array
typedef int64_t ll;

const int N = 1e6 + 5;
vector<int> edges[N];
int n, t, m, dp[N], is[N];
int res = 0;

void dfs(int u, int p = -1){
	is[u] = (u == t);
	vector<int> t;
	for(auto x : edges[u]){
		if(x == p) continue;
		dfs(x, u);
		is[u] |= is[x];
		t.push_back(x);
	}
	edges[u] = t;
	sort(t.begin(), t.end(), [&](int& i, int& j){
		return dp[i] > dp[j];
	});
	
	if(t.empty()) dp[u] = 0;
	else {
		dp[u] = 1 + ((int)t.size() > 1 ? dp[t[1]] + 1 : 0) + max(0, (int)t.size() - 2);
	}
}

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	cin>>n>>t>>m;
	if(t == m){
		cout<<0<<"\n";
		return 0;
	}
	for(int i=1;i<n;i++){
		int a, b; cin>>a>>b;
		edges[a].push_back(b);
		edges[b].push_back(a);
	}
	
	dfs(m);
	int pos = 0, res = 0;
	while(m != t){
		//~ cout<<m<<" "<<t<<endl;
		pos++;
		vector<int> t;
		int c = -1;
		for(auto x : edges[m]){
			if(is[x]) { c = x; continue; }
			t.push_back(x);
		}
		
		sort(t.begin(), t.end(), [&](int& i, int& j){
			return dp[i] > dp[j];
		});
		if(pos >= (int)t.size()){
			pos -= (int)t.size();
			res += (int)t.size();
		} else {
			res += dp[t[pos]] + (int)t.size();
			pos = 1e9;
		}
		m = c;
	}
	
	cout<<res<<"\n";
}

/*

8 7 1
1 2
2 3
3 4
3 5
3 6
4 7
4 8

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...