Submission #400846

#TimeUsernameProblemLanguageResultExecution timeMemory
400846radaiosm7Dreaming (IOI13_dreaming)C++98
100 / 100
105 ms17528 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
#define X first
#define Y second
using namespace std;
vector<pair<int, int> > adj[100005];
vector<int> dists;
bool visited[100005];
int dpd[100005];
int maxd[100005][2];
int ans, i;

int dfs1(int x) {
  int ans = 0;
  visited[x] = true;
  int max1 = 0;
  int max2 = 0;
  dpd[x] = 0;

  for (auto y : adj[x]) {
    if (!visited[y.X]) {
      ans = max(ans, dfs1(y.X));
      dpd[x] = max(dpd[x], dpd[y.X]+y.Y);

      if (dpd[y.X]+y.Y >= max1) {
        max2 = max1;
        max1 = dpd[y.X]+y.Y;
      }

      else if (dpd[y.X]+y.Y >= max2) {
        max2 = dpd[y.X]+y.Y;
      }
    }
  }

  maxd[x][0] = max1;
  maxd[x][1] = max2;
  return max(ans, max1+max2);
}

void swaping(int x, int y, int z, bool ok) {
  if (maxd[x][0] == dpd[y]+z) {
    dpd[x]=maxd[x][1];
  }

  else {
    dpd[x] = maxd[x][0];
  }

  if (ok) {
    if (dpd[x]+z >= maxd[y][0]) {
      maxd[y][1] = maxd[y][0];
      maxd[y][0] = dpd[x]+z;
    }

    else if (dpd[x]+z>maxd[y][1]) {
      maxd[y][1] = dpd[x]+z;
    }
  }

  dpd[y] = maxd[y][0];
  return;
}

int dfs2(int x, int p=-1) {
  int ans = dpd[x];

  for (auto y : adj[x]) {
    if (y.X != p) {
      swaping(x, y.X, y.Y, true);
      ans = min(ans, dfs2(y.X, x));
      swaping(y.X, x, y.Y, false);
    }
  }

  return ans;
}

int travelTime(int n, int m, int l, int A[], int B[], int T[]) {
  fill(visited, visited+n+2, false);
  fill(dpd, dpd+n+2, 0);

  for (i=0; i < m; ++i) {
    adj[A[i]].push_back(make_pair(B[i], T[i]));
    adj[B[i]].push_back(make_pair(A[i], T[i]));
  }
  ans = 0;

  for (i=0; i < n; ++i) {
    if (!visited[i]) {
      ans = max(ans, dfs1(i));
      dists.push_back(dfs2(i));
    }
  }

  sort(dists.begin(), dists.end(), greater<int>());

  if (dists.size() == 1) {
    return max(ans, dists[0]);
  }

  else if (dists.size() == 2) {
    return max(ans, dists[0]+dists[1]+l);
  }

  else {
    return max({ans, dists[0]+dists[1]+l, dists[1]+dists[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...