Submission #1109846

#TimeUsernameProblemLanguageResultExecution timeMemory
1109846SonicMLDreaming (IOI13_dreaming)C++14
100 / 100
53 ms17608 KiB
#include "dreaming.h"
#include <vector>
#include <iostream>

using namespace std;

struct Edge{
  int to;
  int cost;
};

int const NMAX = 1e5;
vector <Edge> g[1 + NMAX];
int below[1 + NMAX];
int above[1 + NMAX];
int visit[1 + NMAX];

void computeBelow(int node, int parent) {
  visit[node] = true;
  for(int i = 0;i < g[node].size();i++) {
    int to = g[node][i].to, cost = g[node][i].cost;
    if(to != parent) {
      computeBelow(to, node);
      below[node] = max(below[node], below[to] + cost);
    }
  }
}

int diameter = 0;

int computeAbove(int node, int parent) {
  int ans = max(above[node], below[node]);
  //cerr << node << ' ' << above[node] << ' ' << below[node] << '\n';
  diameter = max(diameter, ans);
  visit[node] = true;
  int best1 = above[node], best2 = 0;
  for(int i = 0;i < g[node].size();i++) {
    int to = g[node][i].to, cost = g[node][i].cost;
    if(to != parent) {
      if(best1 < below[to] + cost) {
	best2 = best1;
	best1 = below[to] + cost;
      }else if(best2 < below[to] + cost) {
	best2 = below[to] + cost;
      }
    } 
  } 
  for(int i = 0;i < g[node].size();i++) {
    int to = g[node][i].to, cost = g[node][i].cost;
    if(to != parent) {
      if(below[to] + cost == best1) {
        above[to] = best2 + cost;
      }else {
	above[to] = best1 + cost;
      }
      ans = min(ans, computeAbove(to, node));
    }
  }
  return ans;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
  
  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]});
  }
  for(int i = 0;i < N;i++) {
    if(!visit[i]) {
      computeBelow(i, i);
    }
  }
  for(int i = 0;i < N;i++) {
    visit[i] = 0;
  }
  vector <int> len;
  int core = 0, ans = 0;
  for(int i = 0;i < N;i++) {
    if(!visit[i]) {
      diameter = 0;
      int temp = computeAbove(i, i);
      ans = max(ans, diameter);
      //cerr << temp << '\n';
      len.push_back(temp);
      if(len[core] < temp) {
        core = len.size()-1;
      }
    }
  }
  //cerr << '\n';
  int best1 = 0, best2 = 0;
  for(int i = 0;i < len.size();i++) { 
    int temp;
    if(i == core) {
      temp = len[i]; 
    }else {
      temp = len[i] + L; 
    }
    if(best1 < temp) {
      best2 = best1;
      best1 = temp;
    }else if(best2 < temp) {
      best2 = temp;
    }
  }
  ans = max(ans, best1 + best2);
  return ans;
}

Compilation message (stderr)

dreaming.cpp: In function 'void computeBelow(int, int)':
dreaming.cpp:20:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |   for(int i = 0;i < g[node].size();i++) {
      |                 ~~^~~~~~~~~~~~~~~~
dreaming.cpp: In function 'int computeAbove(int, int)':
dreaming.cpp:37:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |   for(int i = 0;i < g[node].size();i++) {
      |                 ~~^~~~~~~~~~~~~~~~
dreaming.cpp:48:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |   for(int i = 0;i < g[node].size();i++) {
      |                 ~~^~~~~~~~~~~~~~~~
dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:92:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |   for(int i = 0;i < len.size();i++) {
      |                 ~~^~~~~~~~~~~~
#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...