Submission #1157654

#TimeUsernameProblemLanguageResultExecution timeMemory
1157654weakweakweak꿈 (IOI13_dreaming)C++20
100 / 100
60 ms12488 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
#define MP make_pair

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    vector<vector<pii>> e(N+2);
    vector<int> meow;
    int inf = 1.1e9;
    vector<int> dis(N+2, inf);
    vector<int> vis(N+2, 0), fa(N+2,0);
    for (int i = 0; i < M; i++) {
        e[A[i]].push_back(MP(B[i], T[i]));
        e[B[i]].push_back(MP(A[i], T[i]));
    }
    
    int mx = 0, mxid, omax = 0;
    auto dfs = [&](int i, int par, auto &&dfs) -> void {
        vis[i] = 1;
        fa[i] = par;
        if (dis[i] > mx) mx = dis[i], mxid = i;
        for (auto [j,w] : e[i]) if (j != par) {
            dis[j] = dis[i] + w;
            dfs(j, i, dfs);
        }
        return;
    };
    for (int i = 0; i < N; i++) {
        if (vis[i]) continue;
        dis[i] = 0;
        mx = 0, mxid = i;
        dfs(i, i, dfs);
        int rt = mxid;
        dis[rt] = 0;
        mx = 0, mxid = rt;
        dfs(rt, rt, dfs);
        omax = max(mx, omax);
        vector<int> route;
        int now = mxid;
        while (true) {
            route.push_back(now);
            if (now == rt) break;
            now = fa[now];
        }
        int ans = mx;
        for (int j : route) ans = min(ans, max(mx-dis[j], dis[j]));
        meow.push_back(ans);
    }

    if (meow.size() == 1) return omax;
    else if (meow.size() == 2) {
        return max(omax,meow[0] + meow[1] + L);
    }
    else {
        sort(meow.begin(), meow.end());
        reverse(meow.begin(), meow.end());
        int ans = meow[0]+meow[1]+L;
        ans = max(ans, meow[1]+meow[2]+L*2);
        ans = max(ans, omax);
        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...