# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
492188 | eNGy | 꿈 (IOI13_dreaming) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define c(x) (cerr << __LINE__ << ": " << #x << ' ' << (x) << endl, (x))
#define vis() (cerr << __LINE__ << endl)
using namespace std;
long long D;
struct trail{
public:
int v, t;
trail(int v, int t): v(v), t(t) {}
};
void massimi(long long &max1, long long &max2, long long &max3, long long l){
}
void dfs(int n, vector<bool> &V, vector<trail> trails[], vector<long long> &d){
V[n] = 1;
for(int i=0; i<trails[n].size(); i++){
int v = trails[n][i].v, t = trails[n][i].t;
if(!V[v]){
d[v] = d[n] + t;
dfs(v, V, trails, d);
}
}
}
int indice_Dmax(vector<long long> l){
int I = 0;
for(int i=1; i<D; i++){
if(l[i] > l[I]){
I = i;
}
}
return I;
}
long long massimo(int n, vector<bool> &V, vector<trail> trails[]){
if(trails[n].size() == 0){
return 0;
}
vector<long long> d(D);
d[n] = 0;
dfs(n, V, trails, d);
int E1 = indice_Dmax(d);
d[E1] = 0;
vector<bool> V2(D, false);
dfs(E1, V2, trails, d);
int E2 = indice_Dmax(d);
long long D = d[E2];
long long sol = D;
for(int i=0; i<D; i++){
sol = min(sol, max(d[i], D-d[i]));
}
return sol;
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]){
D = N;
vector<trail> trails[N];
for(int i=0; i<M; i++){
trails[A[i]].push_back(trail(B[i], T[i]));
trails[B[i]].push_back(trail(A[i], T[i]));
}
vector<bool> V(N, false);
long long max1 = 0, max2 = 0, max3 = 0;
for(int i=0; i<N; i++){
if(!V[i]){
long long l = massimo(i, V, trails);
if(max1 < l){
max3 = max2;
max2 = max1;
max1 = l;
}else if(max2 < l){
max3 = max2;
max2 = l;
}else if(max3 < l){
max3 = l;
}
}
}
return max(max1 + max2 + L, max2 + max3 + 2*L);
}