제출 #306647

#제출 시각아이디문제언어결과실행 시간메모리
306647tengiz05꿈 (IOI13_dreaming)C++17
14 / 100
1092 ms15348 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); int mn = INT_MAX; for(auto x : vertex){ mn = min(mn, max(a[x], b[x])); max_diameter = max(max_diameter, 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)); } }
#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...