#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
int rad;
vector<vector<pair<int, int>>> adj;
vector<bool> vis, dvis;
vector<int> diapath, diaedges;
int diameter(int node, int N){
    diapath.clear(), diaedges.clear();
    int a = 0, b = 0, dist = 0, p;
    dvis = vis;
    queue<pair<int, int>> q;
    vector<int> parent(N);
    q.push({node, 0});
    while(!q.empty()){
        pair<int, int> val = q.front();
        q.pop();
        if(dvis[val.first]) continue;
        for(pair<int, int> i : adj[val.first]){
            if(!dvis[i.first]){
                q.push({i.first, i.second + val.second});
                if(i.second + val.second > dist){
                    a = i.first;
                    dist = i.second + val.second;
                }
            }
        }
        dvis[val.first] = true;
    }
    q.push({a, 0});
    dvis = vis, dist = 0;
    while(!q.empty()){
        pair<int, int> val = q.front();
        q.pop();
        if(dvis[val.first]) continue;
        for(pair<int, int> i : adj[val.first]){
            if(!dvis[i.first]){
                parent[i.first] = val.first;
                q.push({i.first, i.second + val.second});
                if(i.second + val.second > dist){
                    b = i.first;
                    dist = i.second + val.second;
                }
            }
        }
        dvis[val.first] = true;
    }
    p = b;
    while(p != a){
        diapath.push_back(p);
        for(pair<int, int> i : adj[p]) if(i.first == parent[p]) diaedges.push_back(i.second);
        p = parent[p];
    }
    diapath.push_back(a);
    vis = dvis;
    return dist;
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    adj.resize(N);
    int ret = 0, bigcenter = 0, maxdia = 0;
    vector<int> centers;
    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]});
    }
    vis.assign(N, false);
    for(int i = 0; i < N; i++){
        if(!vis[i]){
            int dialength = diameter(i, N);
            vis[i] = true;
            int c = i, c1, c2, p = 0, s = 0, mina, minb;
            if(dialength > 0){
                mina = dialength, minb = dialength;
                for(int j = 1; j < diapath.size(); j++){
                    p += diaedges[j-1];
                    if(max(p, dialength - p) < mina){
                        c1 = diapath[j];
                        mina = max(p, dialength - p);
                    }
                }
                for(int j = diapath.size() - 2; j >= 0; j--){
                    s += diaedges[j];
                    if(max(s, dialength - s) < minb){
                        c2 = diapath[j];
                        minb = max(s, dialength - s);
                    }
                }
                if(mina < minb) c = c1;
                else c = c2;
            }
            if(dialength > maxdia){
                bigcenter = c;
                maxdia = dialength;
            }
            centers.push_back(c);
        }
    }
    for(int i : centers){
        if(i != bigcenter){
            adj[i].push_back({bigcenter, L});
            adj[bigcenter].push_back({i, L});
        }
    }
    vis.assign(N, false);
    return diameter(0, N);
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |