제출 #1353918

#제출 시각아이디문제언어결과실행 시간메모리
1353918waygonz꿈 (IOI13_dreaming)C++20
18 / 100
1096 ms16488 KiB
// #include "dreaming.h"

// int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
//     return 0;
// }

#include "dreaming.h"
#include <bits/stdc++.h>

using namespace std;

const int n = 100000;

int par[n], dep[n], ans[n];
vector<pair<int, int>> adj[n];

int fp(int x) {
    if (par[x] == -1) return x;
    return par[x] = fp(par[x]);
}

int dfs1(int x, int p) {
    int mx = 0;
    for (auto &[u, w] : adj[x]) {
        if (u == p) continue;
        mx = max(mx, w + dfs1(u, x));
    }
    return dep[x] = mx;
}

void dfs2(int x, int p, int v) {
    int t = v;
    for (auto &[u, w] : adj[x]) {
        if (u == p) continue;
        ans[u] = max(ans[u], max(dep[u], v + w));
        dfs2(u, x, v + w);
        v = max(v, dep[u] + w);
    }
    v = t;
    for (int i = adj[x].size() - 1; i >= 0; i--) {
        auto &[u, w] = adj[x][i];
        if (u == p) continue;
        ans[u] = max(ans[u], max(dep[u], v + w));
        dfs2(u, x, v + w);
        v = max(v, dep[u] + w);
    }
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    memset(par, -1, sizeof(par));
    vector<bool> rt(N, false);
    vector<int> mn(N, INT_MAX), l;
    for (int i = 0; i < M; i++) {
        adj[A[i]].emplace_back(B[i], T[i]);
        adj[B[i]].emplace_back(A[i], T[i]);
        int pa = fp(A[i]), pb = fp(B[i]);
        par[pa] = pb;
    }
    for (int i = 0; i < N; i++) rt[fp(i)] = true;
    for (int i = 0; i < N; i++) {
        if (!rt[i]) continue;
        dfs1(i, -1);
        ans[i] = dep[i];
        dfs2(i, -1, 0);
    }
    for (int i = 0; i < N; i++) mn[fp(i)] = min(mn[fp(i)], ans[i]);
    for (int i = 0; i < N; i++) {
        if (!rt[i]) continue;
        l.emplace_back(mn[i]);
    }
    sort(l.rbegin(), l.rend());
    int mx = 0;
    if (l.size() >= 2) mx = max(mx, l[0] + l[1] + L);
    if (l.size() >= 3) mx = max(mx, l[1] + l[2] + 2 * L);
    return mx;
}
#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...