제출 #1332027

#제출 시각아이디문제언어결과실행 시간메모리
1332027DeltaStruct꿈 (IOI13_dreaming)C++20
100 / 100
102 ms32412 KiB
#include <bits/stdc++.h>
using namespace std;
#include "dreaming.h"

int travelTime(int n,int m,int q,int A[],int B[],int C[]){
  vector<vector<pair<int,int>>> G(n);
  for (int i(0);i < m;++i) G[A[i]].emplace_back(B[i],C[i]),G[B[i]].emplace_back(A[i],C[i]);
  vector<int> vis(n,1),mos(n);
  auto dfs = [&](auto& dfs,int x,int p,int d = 0) -> pair<int,int> {
    pair<int,int> ret(0,x);
    for (auto [y,z]:G[x]) if (y!=p) ret = max(ret,dfs(dfs,y,x,z));
    ret.first += d;
    if (vis[x]) vis[x] = 0,mos[x] = ret.first;
    return ret;
  };
  auto dp = [&](auto& dp,int x,int p,int w = 0) -> int {
    multiset<int> S; S.emplace(w);
    for (auto [y,z]:G[x]) if (y!=p) S.emplace(mos[y]);
    int t = *S.rbegin(),ret = t;
    for (auto [y,z]:G[x]) if (y!=p) ret = min(ret,dp(dp,y,x,(t==mos[y]?*next(S.rbegin()):t)+z));
    return ret;
  };
  int res(0);
  vector<int> S;
  for (int i(0);i < n;++i) if (vis[i]){
    res = max(res,dfs(dfs,dfs(dfs,i,-1).second,-1).first);
    S.emplace_back(dp(dp,i,-1));
  }
  sort(S.begin(),S.end(),greater<int>());
  if (S.size()>1) res = max(res,S[0]+S[1]+q);
  if (S.size()>2) res = max(res,S[1]+S[2]+2*q);
  return res;
}
#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...