Submission #807300

#TimeUsernameProblemLanguageResultExecution timeMemory
807300SteGGRace (IOI11_race)C++17
21 / 100
3063 ms29004 KiB
#include <bits/stdc++.h>
#include "race.h"

using namespace std;

const int maxn = 1e6 + 5;
const int inf = 1e9 + 7;

int depth[maxn];
int road[maxn];
int n, k;
vector<pair<int, int>> tr[maxn];

struct Node{
	int index, depth, road;
	int parent;
	Node(){}

	Node(int _index, int _depth, int _road, int _parent) : index(_index), depth(_depth), road(_road), parent(_parent) {}

	bool operator>(const Node &other) const{
		if(depth != other.depth) return depth > other.depth;
		else if(road != other.road){
			if(road <= k && other.road <= k) return road < other.road;
			else if(road <= k) return false;
			else if(other.road <= k) return true;
			else return road > other.road;
		}

		return index > other.index;
	}
};

void dfs(int u, int p){
	for(auto node : tr[u]){
		int v = node.first;
		int w = node.second;
		if(v == p) continue;
		depth[v] = depth[u] + 1;
		road[v] = road[u] + w;
		dfs(v, u);
	}
}

int bfs(int u){
	priority_queue<Node, vector<Node>, greater<Node>> q;
	q.push({u, 0, 0, -1});
	while(!q.empty()){
		Node first = q.top();
		q.pop();
		int u = first.index;
		int cur = first.road;
		if(cur == k){
			return first.depth;
		}

		for(auto node : tr[u]){
			int v = node.first;
			int w = node.second;
			if(v == first.parent) continue;
			q.push({v, first.depth + 1, cur + w, u});
		}
	}

	return inf;
}

int best_path(int N, int K, int H[][2], int L[]){
	n = N;
	k = K;
	for(int i = 0; i < n - 1; i++){
		int a, b, l;
		a = H[i][0];
		b = H[i][1];
		l = L[i];
		tr[a].push_back({b, l});
		tr[b].push_back({a, l});
	}

	int result = inf;
	if(k <= 100){
		for(int i = 0; i < n; i++){
			int temp = bfs(i);
			result = min(result, temp);
		}
	}else{
		for(int i = 0; i < n; i++){
			depth[i] = 0;
			road[i] = 0;
			dfs(i, -1);
			for(int j = 0; j < n; j++){
				if(road[j] == k && result > depth[j]){
					result = depth[j];
				}
			}
		}
	}

	if(result == inf){
		return -1;
	}else{
		return result;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...