제출 #1318356

#제출 시각아이디문제언어결과실행 시간메모리
1318356ayaz꿈 (IOI13_dreaming)C++20
0 / 100
35 ms14976 KiB
#include "bits/stdc++.h" #include <algorithm> #include "dreaming.h" using namespace std; vector<vector<array<int, 2>>> g; vector<bool> used; vector<int> dis, nodes, path; int n; void dfs(int u, int p = -1) { used[u] = 1; nodes.push_back(u); for (auto &[v, w] : g[u]) { if (v == p) continue; dis[v] = dis[u] + w; dfs(v, u); } } bool findPath(int u, int tar, int p = -1) { path.push_back(u); if (u == tar) return true; for (auto &[v, w] : g[u]) { if (v == p) continue; if (findPath(v, tar, u)) return true; } path.pop_back(); return false; } int findCenter(int u) { nodes.clear(); dis[u] = 0; dfs(u); int s = 0; for (auto &i : nodes) if (dis[i] > dis[s]) s = i; int start = s; nodes.clear(); dis[s] = 0; dfs(s); int f = 0; for (auto &i : nodes) if (dis[i] > dis[f]) f = i; path.clear(); findPath(s, f); int len = (int)path.size(); int cent = max(dis[path[len / 2]], dis[path[(len - 1) / 2]]); return cent; } int travelTime(int N, int M, int L, int A[], int B[], int T[]) { int m = M, l = L; n = N; dis.resize(n + 1); g.resize(n + 1); used.assign(n + 1, false); for (int i = 0; i < m; i++) { int u = A[i], v = B[i], w = T[i]; u++, v++; g[u].push_back({v, w}); g[v].push_back({u, w}); } vector<int> mx; for (int u = 1; u <= n; u++) { if (used[u]) continue; mx.push_back(findCenter(u)); } sort(mx.rbegin(), mx.rend()); if (int(mx.size()) <= 2) return mx[0] + mx[1] + l; return max(mx[1] + mx[2] + 2 * l, mx[0] + mx[1] + l); }
#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...