제출 #1305264

#제출 시각아이디문제언어결과실행 시간메모리
1305264fly꿈 (IOI13_dreaming)C++20
32 / 100
32 ms12012 KiB
#include <bits/stdc++.h> using namespace std; vector<vector<pair<int, int>>> connections(100000); vector<bool> visited(100000); vector<pair<int, int>> far(100000, {-1, 0}); vector<pair<int, int>> sfar(100000, {-1, 0}); int treeans; int treedia; vector<int> answers; vector<int> dias; void fdfs(int cur, int par) { visited[cur] = true; for (pair<int, int> next: connections[cur]) { if (next.first == par) continue; fdfs(next.first, cur); int d = far[next.first].second + next.second; if (d > far[cur].second) { sfar[cur] = far[cur]; far[cur].first = next.first; far[cur].second = d; } else if (d > sfar[cur].second) { sfar[cur].first = next.first; sfar[cur].second = d; } } } void sdfs(int cur, int par) { for (pair<int, int> next: connections[cur]) { if (next.first == par) continue; if (far[cur].first != next.first) { if (far[cur].second + next.second > far[next.first].second) { sfar[next.first] = far[next.first]; far[next.first] = {cur, far[cur].second + next.second}; } else if (far[cur].second + next.second > sfar[next.first].second) { sfar[next.first] = {cur, far[cur].second + next.second}; } } else { if (sfar[cur].second + next.second > far[next.first].second) { sfar[next.first] = far[next.first]; far[next.first] = {cur, sfar[cur].second + next.second}; } else if (far[cur].second + next.second > sfar[next.first].second) { sfar[next.first] = {cur, sfar[cur].second + next.second}; } } sdfs(next.first, cur); } treeans = min(treeans, far[cur].second); treedia = max(treedia, far[cur].second + sfar[cur].second); } extern "C"{ int travelTime(int N, int M, int L, int A[], int B[], int T[]) { int n = N; int m = M; int l = L; connections.assign(n, vector<pair<int, int>>()); visited.assign(n, false); far.assign(n, {-1, 0}); sfar.assign(n, {-1, 0}); answers.clear(); for (int i = 0; i < m; ++i) { connections[A[i]].push_back({B[i], T[i]}); connections[B[i]].push_back({A[i], T[i]}); } treedia = 0; for (int i = 0; i < n; ++i) { if (!visited[i]) { fdfs(i, -1); treeans = INT_MAX; sdfs(i, -1); answers.push_back(treeans); dias.push_back(treedia); } } sort(answers.begin(), answers.end(), greater<int>()); if (answers.size() > 2) { return max(treedia, max(answers[0] + answers[1] + l, answers[1]+answers[2] + 2*l)); } if (answers.size() > 1) { return max(treedia, answers[0] + answers[1] + l); } else { return treedia; } } }
#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...