제출 #846594

#제출 시각아이디문제언어결과실행 시간메모리
846594siewjhDreaming (IOI13_dreaming)C++17
100 / 100
82 ms25160 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; vector<pair<int, int>> adj[MAXN], cdist[MAXN]; bool pro[MAXN]; int dia, mxd; int dfs(int x, int par){ pro[x] = 1; for (auto nxt : adj[x]){ int nn, nd; tie(nn, nd) = nxt; if (nn == par) continue; cdist[x].push_back({nd + dfs(nn, x), nn}); } for (int i = 0; i < 2; i++) cdist[x].push_back({0, -1}); sort(cdist[x].begin(), cdist[x].end(), greater<pair<int, int>>()); return cdist[x][0].first; } void dfs2(int x, int par, int pd){ dia = max(dia, max(pd + cdist[x][0].first, cdist[x][0].first + cdist[x][1].first)); mxd = min(mxd, max(pd, cdist[x][0].first)); for (auto nxt : adj[x]){ int nn, nd; tie(nn, nd) = nxt; if (nn == par) continue; if (nn == cdist[x][0].second) dfs2(nn, x, max(pd, cdist[x][1].first) + nd); else dfs2(nn, x, max(pd, cdist[x][0].first) + nd); } } int travelTime(int nodes, int edges, int L, int A[], int B[], int T[]) { for (int i = 0; i < edges; i++){ int a = A[i], b = B[i], c = T[i]; adj[a].push_back({b, c}); adj[b].push_back({a, c}); } int ans = 0; vector<int> mxdvec; for (int i = 0; i < nodes; i++) if (!pro[i]){ dia = 0, mxd = 2e9; dfs(i, -1); dfs2(i, -1, 0); ans = max(ans, dia); mxdvec.push_back(mxd); } sort(mxdvec.begin(), mxdvec.end(), greater<int>()); if (mxdvec.size() >= 2) ans = max(ans, mxdvec[0] + mxdvec[1] + L); if (mxdvec.size() >= 3) ans = max(ans, mxdvec[1] + mxdvec[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...