Submission #1207832

#TimeUsernameProblemLanguageResultExecution timeMemory
1207832orcslopDreaming (IOI13_dreaming)C++20
59 / 100
1092 ms9408 KiB
#include <bits/stdc++.h>
#if __has_include("dreaming.h")
#include "dreaming.h"
#endif
using namespace std;
using ll = long long; 
#ifdef LOCAL
#include "debug.h"
#else
#define dbg(...) 0
#define dbgn(...) 0
#endif

int travelTime(int n, int m, int l, int a[], int b[], int t[]) {
    vector<vector<pair<int, int>>> adj(n);
    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]});
    }
    const int INF = 1e9;
    vector<int> cc_radii;
    vector<int> cc_diameters;
    auto get_tree_dists = [&](int start_node) {
        vector<int> dist(n, INF);
        if (start_node >= 0 && start_node < n) {
            dist[start_node] = 0;
            queue<int> q;
            q.push(start_node);
            while (!q.empty()) {
                int u = q.front();
                q.pop();
                for (auto& edge : adj[u]) {
                    int v = edge.first;
                    int weight = edge.second;
                    if (dist[v] == INF) {
                        dist[v] = dist[u] + weight;
                        q.push(v);
                    }
                }
            }
        }
        return dist;
    }; 
    vector<bool> vis(n, false);
    for (int i = 0; i < n; ++i) {
        if (!vis[i]) {
            vector<int> ccn;
            queue<int> q_nodes;
            q_nodes.push(i);
            vis[i] = true;
            while (!q_nodes.empty()) {
                int u = q_nodes.front();
                q_nodes.pop();
                ccn.push_back(u);
                for (auto& edge : adj[u]) {
                    int v = edge.first;
                    if (!vis[v]) {
                        vis[v] = true;
                        q_nodes.push(v);
                    }
                }
            }
            if (ccn.size() <= 1) {
                cc_radii.push_back(0);
                cc_diameters.push_back(0);
                continue;
            }
            vector<int> st_dist = get_tree_dists(i);
            int endpoint_a = -1;
            int max_dist = -1;
            for (int node : ccn) {
                if (st_dist[node] != INF && st_dist[node] > max_dist) {
                    max_dist = st_dist[node];
                    endpoint_a = node;
                }
            }
            vector<int> a_dist = get_tree_dists(endpoint_a);
            int endpoint_b = -1;
            int component_diameter = -1;
            for (int node : ccn) {
                if (a_dist[node] != INF && a_dist[node] > component_diameter) {
                    component_diameter = a_dist[node];
                    endpoint_b = node;
                }
            }
            cc_diameters.push_back(component_diameter);
            vector<int> b_dist = get_tree_dists(endpoint_b);
            int component_radius = INF;
            for (int node : ccn) {
                int e = max(a_dist[node], b_dist[node]);
                if (e < component_radius) {
                    component_radius = e;
                }
            }
            cc_radii.push_back(component_radius);
        }
    }
    int ans = 0;
    if (!cc_diameters.empty()) {
        ans = *max_element(cc_diameters.begin(), cc_diameters.end());
    }
    sort(cc_radii.begin(), cc_radii.end(), greater<int>());
    if (cc_radii.size() >= 2) {
        ans = max(ans, cc_radii[0] + cc_radii[1] + l);
    }
    if (cc_radii.size() >= 3) {
        ans = max(ans, cc_radii[1] + cc_radii[2] + 2 * l);
    }
    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...