Submission #507601

#TimeUsernameProblemLanguageResultExecution timeMemory
507601thiago_bastos꿈 (IOI13_dreaming)C++17
100 / 100
106 ms19780 KiB
#include "dreaming.h"
#include <vector>
#include <utility>
#include <functional>
#include <algorithm>
 
using namespace std;
 
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    vector<int> dmax(N, -1), d;
	vector<vector<pair<int, int>>> g(N);
	int y, ans = 0;
 
	for(int i = 0; i < M; ++i) {
		g[A[i]].emplace_back(B[i], T[i]);
		g[B[i]].emplace_back(A[i], T[i]);
	}
 
	function<void(int, int)> preProcess = [&](int u, int p) {
		dmax[u] = 0;
		for(auto [v, w] : g[u]) {
			if(v == p) continue;
			preProcess(v, u);
			dmax[u] = max(dmax[u], dmax[v] + w);
		}
	};
 
	function<void(int, int, int)> dfs = [&](int u, int p, int x) {
		int d[2] = {0};
		for(auto [v, w] : g[u]) {
			if(v == p) continue;
			else if(w + dmax[v] > d[0]) d[1] = d[0], d[0] = w + dmax[v];
			else d[1] = max(d[1], w + dmax[v]);
		}
		dmax[u] = max(dmax[u], x);
		y = min(y, dmax[u]);
		ans = max(ans, dmax[u]);
		for(auto [v, w] : g[u]) {
			if(v == p) continue;
			dfs(v, u, w + max(x, d[w + dmax[v] == d[0]]));
		}
	};
 
	for(int i = 0; i < N; ++i) {
		if(dmax[i] != -1) continue;
		y = numeric_limits<int> :: max();
		preProcess(i, i);
		dfs(i, i, 0);
		d.push_back(y);
	}
 
	sort(d.rbegin(), d.rend());
 
	if(M < N - 1) ans = max(ans, d[0] + d[1] + L);
	if(M < N - 2) ans = max(ans, d[1] + d[2] + 2 * L);
 
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...