Submission #306648

#TimeUsernameProblemLanguageResultExecution timeMemory
306648tengiz05Dreaming (IOI13_dreaming)C++17
59 / 100
1083 ms16628 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
int n;
const int N = 1e5+5;
bool used[N];
vector<pair<int, int>> edges[N];
// dfs for calculating maximum depth. (V[i] - distance from the root)
int mx, mxind;
vector<int> vertex;
void dfs(int u, int p, int dist, vector<int> &V, bool flag = 0){
	used[u] = true;
	if(flag)vertex.push_back(u);
	V[u] = dist;
	if(dist > mx){
		mx = dist;
		mxind = u;
	}
	for(auto X : edges[u]){
		int v = X.first;
		int cost = X.second;
		if(v == p)continue;
		dfs(v, u, dist + cost, V, flag);
	}
}

//calculate best center for the tree
int max_diameter;
int calculate_center(int u){
	vertex.clear();
	mx = -1;
	vector<int> no_need(n);
	dfs(u, u, 0, no_need, 1);
	mx = -1;
	int ind1 = mxind;
	vector<int> a(n);
	dfs(ind1, ind1, 0, a);
	
	int ind2 = mxind;
	vector<int> b(n);
	dfs(ind2, ind2, 0, b);
	max_diameter = max(max_diameter, mx);
	int mn = INT_MAX;
	for(auto x : vertex){
		mn = min(mn, max(a[x], b[x]));
	}return mn;
}
int travelTime(int _N, int M, int L, int A[], int B[], int T[]) {
	n = _N;
	for(int i=0;i<M;i++){
		edges[A[i]].push_back({B[i], T[i]});
		edges[B[i]].push_back({A[i], T[i]});
	}
	vector<int> v;
	for(int i=0;i<n;i++){
		if(!used[i]){
			v.push_back(calculate_center(i));
		}
	}
	sort(v.begin(), v.end());
	reverse(v.begin(), v.end());
	if(v.size() == 1){
		return max_diameter;
	}else {
		return max(max(max_diameter, v[0]+v[1]+L), ((v.size() > 2)? v[1]+v[2]+L*2 : 0));
	}
}

/*

12 8 2
0 8 4
8 2 2
2 7 4
5 11 3
5 1 7
1 3 1
1 9 5
10 6 3

*/
#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...