제출 #1345016

#제출 시각아이디문제언어결과실행 시간메모리
1345016nathlol2꿈 (IOI13_dreaming)C++20
47 / 100
39 ms16156 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
const int mxN = 1e5;
int c, dp[mxN], dpr[mxN], mn[mxN], vis[mxN];
vector<pair<int, int>> adj[mxN];

void dfs(int u, int p){
    vis[u] = 1;
    for(auto [v, w] : adj[u]) if(v != p) dfs(v, u), dp[u] = max(dp[u], dp[v] + w);
}

void dfs1(int u, int p){
    mn[c] = min(mn[c], max(dp[u], dpr[u]));
    pair<int, int> mx, smx;
    for(auto [v, w] : adj[u]){
        if(v == p) continue;
        if(dp[v] + w > mx.first){
            smx = mx;
            mx = {dp[v] + w, v};
        }else if(dp[v] + w > smx.first){
            smx = {dp[v] + w, v};
        }
    }
    for(auto [v, w] : adj[u]){
        if(v == p) continue;
        dpr[v] = dpr[u] + w;
        if(v == mx.second) dpr[v] = max(dpr[v], smx.first + w);
        else dpr[v] = max(dpr[v], mx.first + w);
        dfs1(v, u);
    }
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]){
    for(int i = 0;i<M;i++){
        adj[A[i]].push_back({B[i], T[i]});
        adj[B[i]].push_back({A[i], T[i]});
    }
    for(int i = 0;i<N;i++) mn[i] = INT_MAX;
    for(int i = 0;i<N;i++){
        if(!vis[i]){
            dfs(i, i);
            dfs1(i, i);
            ++c;
        }
    }
    int mx = 0, smx = 0;
    for(int i = 0;i<c;i++){
        if(mn[i] > mx){
            smx = mx;
            mx = mn[i];
        }else if(mn[i] > smx){
            smx = mn[i];
        }
    }
    int ans = mx + smx + L;
    for(int i = 0;i<N;i++) ans = max(ans, dp[i] + dpr[i]);
    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...