Submission #90792

#TimeUsernameProblemLanguageResultExecution timeMemory
90792arman_ferdousDreaming (IOI13_dreaming)C++17
100 / 100
145 ms12036 KiB
#include <bits/stdc++.h>
#include "dreaming.h"
using namespace std;

const int N = 1e5+10;
int n, dist[N];
vector< pair<int,int> > g[N], center;

int mx, sc;
void dfs0(int u, int f, int d) {
	dist[u] = d;
	if(dist[u] > mx) mx = dist[u], sc = u;
	for(auto e : g[u]) if(e.first != f)
		dfs0(e.first, u, d + e.second);
}

void dfs1(int u, int f, int d) {
	dist[u] = d;
	if(dist[u] > mx) mx = dist[u], sc = u;
	for(auto e : g[u]) if(e.first != f)
		dfs1(e.first, u, d + e.second);
}
void dfs2(int u, int f, int d) {
	dist[u] = max(dist[u], d);
	if(dist[u] < mx) mx = dist[u], sc = u;
	for(auto e : g[u]) if(e.first != f)
		dfs2(e.first, u, d + e.second);
}

int travelTime(int N_, int M, int L, int A[], int B[], int T[]) {
	n = N_;
	for(int i = 0; i < M; i++) {
		g[A[i]].push_back({B[i], T[i]});
		g[B[i]].push_back({A[i], T[i]});
	}
	memset(dist,-1,sizeof dist);
	for(int i = 0; i < n; i++) {
		if(dist[i] == -1) {
			mx = -1; dfs0(i,-1,0);
			mx = -1; dfs1(sc,-1,0);
			mx = (int)2e9; dfs2(sc,-1,0);
			center.push_back({-dist[sc], sc});
		}
	} sort(center.begin(), center.end());
	int sz = center.size();
	for(int i = 1; i < sz; i++) {
		g[center[0].second].push_back({center[i].second, L});
		g[center[i].second].push_back({center[0].second, L});
	}
	memset(dist,-1,sizeof dist);
	mx = -1; dfs0(0,-1,0);
	mx = -1; dfs1(sc,-1,0);
	dfs2(sc,-1,0);

	int ans = 0;
	for(int i = 0; i < n; i++)
		ans = max(ans, dist[i]);
	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...