Submission #470309

#TimeUsernameProblemLanguageResultExecution timeMemory
470309bedirhanRace (IOI11_race)C++17
100 / 100
583 ms101520 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
#define all(x) x.begin(), x.end()

int best_path(int n, int k, int h[][2], int l[]){
	vector<vector<array<int, 2>>> adj(n);
	for(int i = 0; i < n - 1; ++i){
		int u = h[i][0], v = h[i][1], w = l[i];
		adj[u].push_back({v, w});
		adj[v].push_back({u, w});
	}
	constexpr int INF = 1e9 + 7;
	ll ans = INF;
	map<ll, ll> mp[n]; 
	function<void(int, int, ll, ll)> dfs = [&](int u, int p, ll dis, ll dep){
		mp[u][dis] = dep;
		for(auto &[v, w] : adj[u]){
			if(v == p) continue;
			dfs(v, u, dis + w, dep + 1);
			if(mp[u].size() < mp[v].size()){
				swap(mp[u], mp[v]);
			}
			for(auto &[ndis, ndep] : mp[v]){
				ll target = k + 2 * dis - ndis;
				if(mp[u].count(target))
					ans = min(ans, mp[u][target] + ndep - 2 * dep);
			}
			for(auto &[ndis, ndep] : mp[v]){
				if(!mp[u].count(ndis)){
					mp[u][ndis] = ndep;
				}else{
					mp[u][ndis] = min(mp[u][ndis], ndep);
				}
			}
		}
	};
	dfs(0, -1, 0, 0);
	if(ans == INF) ans = -1;
	return ans;
}

/*
int main(){
	cin.tie(0)->sync_with_stdio(0);
	int n, k; cin >> n >> k;
	vector<vector<array<int, 2>>> adj(n);
	for(int i = 0; i < n - 1; ++i){
		int u, v, w; cin >> u >> v >> w;
		adj[u].push_back({v, w});
		adj[v].push_back({u, w});
	}
	constexpr int INF = 1e9 + 7;
	ll ans = INF;
	map<ll, ll> mp[n]; 
	function<void(int, int, ll, ll)> dfs = [&](int u, int p, ll dis, ll dep){
		mp[u][dis] = dep;
		for(auto &[v, w] : adj[u]){
			if(v == p) continue;
			dfs(v, u, dis + w, dep + 1);
			if(mp[u].size() < mp[v].size()){
				swap(mp[u], mp[v]);
			}
			for(auto &[ndis, ndep] : mp[v]){
				ll target = k + 2 * dis - ndis;
				if(mp[u].count(target))
					ans = min(ans, mp[u][target] + ndep - 2 * dep);
			}
			for(auto &[ndis, ndep] : mp[v]){
				if(!mp[u].count(ndis)){
					mp[u][ndis] = ndep;
				}else{
					mp[u][ndis] = min(mp[u][ndis], ndep);
				}
			}
		}
	};
	dfs(0, -1, 0, 0);
	if(ans == INF) ans = -1;
	cout << ans << '\n';
}
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...