제출 #31789

#제출 시각아이디문제언어결과실행 시간메모리
31789DiuvenDreaming (IOI13_dreaming)C++11
18 / 100
65 ms11384 KiB
#include <bits/stdc++.h>
#include "dreaming.h"
using namespace std;
typedef struct {int to, cost;} edge;
vector<edge> G[100010];
vector<int> rad;
bool done[100010];
int N, M, L, tmp, sz[100010], u, D;
int dfs(int v){
	done[v]=true, sz[v]=1;
	for(auto& e:G[v])
		if(!done[e.to])	sz[v]+=dfs(e.to);
	return sz[v];
}
int findcen(int v){
	dfs(v);
	int now=v;
	bool iscen=false;
	while(!iscen){
		iscen=true;
		for(auto& e:G[now])
			if(sz[now]>sz[e.to]&&sz[e.to]>sz[v]/2){
				iscen=false, now=e.to;
				break;
			}
	}
	return now;
}
void find(int v, int p=-1, int d=0){
	if(tmp<=d)	tmp=d, u=v;
	for(auto& e:G[v])
		if(e.to!=p)	find(e.to, v, d+e.cost);
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]){
	for(int i=0; i<M; i++){
		G[A[i]+1].push_back({B[i]+1, T[i]});
		G[B[i]+1].push_back({A[i]+1, T[i]});
	}
	for(int i=1; i<=N; i++)
		if(!done[i]){
			int c=findcen(i);
			tmp=0, find(c), rad.push_back(tmp);
			tmp=0, find(u), D=max(D, tmp);
		}
	sort(rad.begin(), rad.end(), greater<int>());
	if(rad.size()>1U)	D=max(D, rad[0]+rad[1]+L);
	if(rad.size()>2U)	D=max(D, rad[1]+rad[2]+2*L);
	return D;
}
#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...