Submission #1255947

#TimeUsernameProblemLanguageResultExecution timeMemory
1255947comgaTramAnhDreaming (IOI13_dreaming)C++20
0 / 100
1096 ms21312 KiB
#include <bits/stdc++.h> 
#include "dreaming.h"
using namespace std;
vector <vector <pair <int, int>>> adj;
vector <bool> visited;
vector <int> f_out, f_in;
vector <vector <int>> prefix, suffix; 
void dfs_out(int u, int father) {
  visited[u] = true; 
  for (int i = 0; i < (int) adj[u].size(); i++) {
    pair <int, int> neighbor = adj[u][i]; 
    if (neighbor.first != father) {
      dfs_out(neighbor.first, u);
      f_out[u] = max(f_out[u], f_out[neighbor.first] + neighbor.second);  
    }
  }
  prefix[u].clear(); 
  prefix[u].resize((int) adj[u].size() + 2); 
  prefix[u][0] = 0; 
  for (int i = 1; i <= (int) adj[u].size(); i++) {
    prefix[u][i] = max(prefix[u][i - 1], f_out[adj[u][i - 1].first] + adj[u][i - 1].second);
  }
  suffix[u].clear(); 
  suffix[u].resize((int) adj[u].size() + 2); 
  suffix[u][(int) adj[u].size() + 1] = 0; 
  for (int i = (int) adj[u].size(); i >= 1; i--) {
    suffix[u][i] = max(suffix[u][i + 1], f_out[adj[u][i - 1].first] + adj[u][i - 1].second);
  }
}
void dfs_in(int u, int father) {
  for (int i = 0; i < (int) adj[u].size(); i++) {
    pair <int, int> neighbor = adj[u][i]; 
    if (neighbor.first == father) {
      continue; 
    }
    f_in[neighbor.first] = max(f_in[neighbor.first], f_in[u] + neighbor.second); 
    f_in[neighbor.first] = max(f_in[neighbor.first], max(prefix[u][i], suffix[u][i + 2]) + neighbor.second); 
    dfs_in(neighbor.first, u); 
  }
}
int solve(int u) {                        
  int n = (int) adj.size();
  visited.clear(); 
  visited.resize(n, false); 
  dfs_out(u, -1);
  dfs_in(u, -1);
  int ans = 1000000007; 
  for (int i = 0; i < n; i++) {
    if (visited[i] == true) {
      ans = min(ans, max(f_in[u], f_out[u]));   
    }
  }  
  return ans; 
}
int travelTime(int n, int m, int l, int a[], int b[], int t[]) {
  adj.resize(n);
  visited.resize(n, false);
  for (int 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]));
  }
  int ans = 0; 
  f_out.resize(n, 0); 
  f_in.resize(n, 0);
  prefix.resize(n);
  suffix.resize(n);
  for (int i = 0; i < n; i++) {
    if (visited[i] == false) {
      ans += solve(i);  
    }
  } 
  /*for (int u = 0; u < n; u++) {
    cout << max(f_out[u], f_in[u]) << "    "; 
  } */
  ans += 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...