제출 #1316139

#제출 시각아이디문제언어결과실행 시간메모리
1316139kawhiet꿈 (IOI13_dreaming)C++20
100 / 100
55 ms16424 KiB
#include <bits/stdc++.h> #include "dreaming.h" using namespace std; constexpr int inf = 1e9; vector<bool> vis; vector<vector<pair<int, int>>> g; vector<int> dp1, dp2, res, nodes; void dfs_down(int u, int p) { nodes.push_back(u); vis[u] = 1; for (auto [v, w] : g[u]) { if (v == p) continue; dfs_down(v, u); if (dp1[v] + w > dp1[u]) { dp2[u] = dp1[u]; dp1[u] = dp1[v] + w; } else { dp2[u] = max(dp2[u], dp1[v] + w); } } res[u] = max(res[u], dp1[u]); } void dfs(int u, int p, int up) { res[u] = max(res[u], up); for (auto [v, w] : g[u]) { if (v == p) continue; int mx = 0; if (dp1[v] + w == dp1[u]) { mx = dp2[u]; } else { mx = dp1[u]; } dfs(v, u, max(up, mx) + w); } } int travelTime(int n, int m, int l, int a[], int b[], int t[]) { g.resize(n); vis.resize(n); dp1.resize(n); dp2.resize(n); res.resize(n); for (int i = 0; i < m; i++) { int u = a[i], v = b[i], w = t[i]; g[u].push_back({v, w}); g[v].push_back({u, w}); } int ans = 0; vector<int> x; for (int i = 0; i < n; i++) { if (!vis[i]) { dfs_down(i, -1); dfs(i, -1, 0); int mn = inf; for (auto j : nodes) { ans = max(ans, res[j]); mn = min(mn, res[j]); } x.push_back(mn); for (auto j : nodes) { dp1[j] = dp2[j] = res[j] = 0; } nodes.clear(); } } sort(x.rbegin(), x.rend()); if (x.size() >= 2) { ans = max(ans, x[0] + x[1] + l); } if (x.size() >= 3) { ans = max(ans, x[1] + x[2] + 2 * l); } 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...