제출 #1318386

#제출 시각아이디문제언어결과실행 시간메모리
1318386ayaz꿈 (IOI13_dreaming)C++20
14 / 100
1095 ms131072 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, par;
int n;
void dfs(int u, bool collect = 0, int p = -1) {
  if (collect) {
    nodes.push_back(u);
  }
  used[u] = 1;
  par[u] = p;
  for (auto &[v, w] : g[u]) {
    if (v == p) continue;
    dis[v] = dis[u] + w;
    dfs(v, collect, u);
  }
}
pair<int, vector<int>> findDiameter(int u) {
  dis[u] = 0;
  nodes.clear();
  dfs(u, 1);
  int start = 0;
  for (auto i : nodes) if (dis[i] > dis[start]) start = i;
  nodes.clear();
  dis[start] = 0;
  dfs(start, 1);
  int finish = 0;
  for (auto i : nodes) if (dis[i] > dis[finish]) finish = i;
  nodes.clear();
  vector<int> path;
  for (int v = finish; v != -1; v = par[v])
    path.push_back(v);
  return {dis[finish], path};
}
array<int, 2> findCenter(int u) {
  int ans = 1e9, cent;
  auto [diameter, path] = findDiameter(u);
  for (auto &i : path) {
    int cur = max(dis[i], diameter - dis[i]);
    if (cur <= ans) {
      ans = cur;
      cent = i;
    }
  }
  return {ans, 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, 0);
  par.resize(n + 1, 0);
  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<array<int, 2>> mx;
  for (int u = 1; u <= n; u++) {
    if (used[u]) continue;
    mx.push_back(findCenter(u));
  }
  sort(mx.rbegin(), mx.rend());
  for (int i = 1; i < size(mx); i++) {
    g[mx[i][1]].push_back({mx[0][1], l});
    g[mx[0][1]].push_back({mx[i][1], l});
  }
  int ans = 0;
  ans = findDiameter(1).first;
  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...