Submission #157917

#TimeUsernameProblemLanguageResultExecution timeMemory
157917WLZ꿈 (IOI13_dreaming)C++14
59 / 100
1074 ms16500 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;

const int INF = 0x3f3f3f3f;

vector< vector< pair<int, int> > > g;
vector<int> was, cur;

void dfs(int u, int p, vector<int>& dist) {
  was[u] = 1;
  cur.push_back(u);
  for (auto& v : g[u]) {
    if (v.first != p) {
      dist[v.first] = dist[u] + v.second;
      dfs(v.first, u, dist);
    }
  }
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
  g.resize(N);
  for (int i = 0; i < M; i++) {
    g[A[i]].push_back({B[i], T[i]});
    g[B[i]].push_back({A[i], T[i]});
  }
  was.assign(N, 0);
  vector<int> v;
  int ans = 0;
  for (int i = 0; i < N; i++) {
    if (was[i]) {
      continue;
    }
    vector<int> dist_a(N, 0);
    cur.clear();
    dfs(i, -1, dist_a);
    int a = cur[0];
    for (auto& x : cur) {
      if (dist_a[x] > dist_a[a]) {
        a = x;
      }
    }
    cur.clear();
    dist_a[a] = 0;
    dfs(a, -1, dist_a);
    int b = cur[0];
    for (auto& x : cur) {
      if (dist_a[x] > dist_a[b]) {
        b = x;
      }
    }
    ans = max(ans, dist_a[b]);
    cur.clear();
    vector<int> dist_b(N, 0);
    dfs(b, -1, dist_b);
    int tmp = INF;
    for (auto& x : cur) {
      tmp = min(tmp, max(dist_a[x], dist_b[x]));
    }
    v.push_back(tmp);
  }
  sort(v.rbegin(), v.rend());
  if ((int) v.size() >= 2) {
    ans = max(ans, v[0] + v[1] + L);
    if ((int) v.size() >= 3) {
      ans = max(ans, v[1] + v[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...