Submission #1194051

#TimeUsernameProblemLanguageResultExecution timeMemory
1194051vyaductDreaming (IOI13_dreaming)C++20
0 / 100
1097 ms10688 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;

const int N = 100'000;
vector<pair<int,int>> adj[N];
bool visited[N];

void dfs_cc(int s, int e, vector<int> &g){
  g.push_back(s);
  visited[s] = true;
  for (auto [u,w]: adj[s]){
    if (u == e) continue;
    dfs_cc(u, s, g);
  }
}

int travelTime(int n, int m, int L, int A[], int B[], int T[]) {
  for (int i=0;i<N;i++) visited[i] = false;
  for (int i=0;i<m;i++){
    int u = A[i], v = B[i], w = T[i];
    adj[u].push_back({v, w});
    adj[v].push_back({u, w});
  }

  vector<vector<int>> subG;
  for (int i=0;i<n;i++) {
    if (!visited[i]){
      vector<int> cur;
      dfs_cc(i, -1, cur);
      subG.push_back(cur);
    }
  }
  
  int ans=0;
  for (auto G: subG){
    int s = -1, e = -1;
    for (auto x: G){
      if (adj[x].size() == 1){
        if (s == -1) s=x;
        else e=x;
      }
    }
    int par=s;
    int i = s, j = e;
    int sum = adj[i][0].second;
    i = adj[i][0].first;
    while (i != j){
      for (auto [u,w]: adj[i]){
        if (u == par) continue;
        else {
          par = i;
          i = u;
          sum += w;
        }
      }
    }
    i = s, j = e;
    i = adj[i][0].first;
    int ss=0;
    int cur=sum;
    while (i != j){
      for (auto [u,w]: adj[i]){
        if (u == par) continue;
        else {
          par = i;
          i = u;
          ss += w;
          cur = min(cur, max(ss, sum-ss));
        }
      }
    }
    ans += cur;
  }
  return ans + 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...