Submission #1010217

#TimeUsernameProblemLanguageResultExecution timeMemory
1010217spacewalkerDreaming (IOI13_dreaming)C++17
18 / 100
32 ms9420 KiB
#include <bits/stdc++.h>

using namespace std;

#include "dreaming.h"

vector<pair<int, int>> distances(const vector<vector<pair<int, int>>> &graph, int start, vector<int> &dist, vector<int> &par) {
  queue<int> q;
  q.push(start);
  dist[start] = 0;
  vector<pair<int, int>> component;
  while (!q.empty()) {
    int cur = q.front(); q.pop();
    component.emplace_back(dist[cur], cur);
    for (auto [u, w] : graph[cur]) {
      if (dist[u] != -1) continue;
      dist[u] = dist[cur] + w;
      par[u] = cur;
      q.push(u);
    }
  }
  return component;
}

int find_cc_radius(const vector<vector<pair<int, int>>> &graph, int start, vector<int> &dist, vector<int> &par) {
  vector<pair<int, int>> cc = distances(graph, start, dist, par);
  int v1 = max_element(cc.begin(), cc.end())->second;
  // reset the dist array, so we can run the second BFS
  for (auto [_, v] : cc) dist[v] = -1;
  cc = distances(graph, v1, dist, par);
  int v2 = max_element(cc.begin(), cc.end())->second;
  // The "center" of the tree must be on the v1-v2 path.
  int diameter = dist[v2];
  int ans = diameter;
  for (; v2 != v1; v2 = par[v2]) {
    ans = min(ans, max(dist[v2], diameter - dist[v2]));
  }
  return ans;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
  vector<int> radius;
  vector<vector<pair<int, int>>> graph(N);
  for (int i = 0; i < M; ++i) {
    graph[A[i]].emplace_back(B[i], T[i]);
    graph[B[i]].emplace_back(A[i], T[i]);
  }
  vector<int> visited(N, -1), par(N, -1);
  for (int i = 0; i < N; ++i) {
    if (visited[i] != -1) continue;
    radius.emplace_back(find_cc_radius(graph, i, visited, par));
  }
  sort(radius.begin(), radius.end(), greater());
  if (radius.size() == 1) {
    return radius[0];
  } else if (radius.size() == 2) {
    return radius[0] + radius[1] + L;
  } else {
    return max(radius[0] + radius[1] + L, radius[1] + radius[2] + 2 * 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...