제출 #1184270

#제출 시각아이디문제언어결과실행 시간메모리
1184270kiwimsy꿈 (IOI13_dreaming)C++20
100 / 100
63 ms10464 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
#define ll long long

using namespace std;

vector<vector<pair<int, int>>> adj;
vector<bool> vis, comp;
vector<int> diapath, diaedges;
vector<int> parent;

pair<ll, ll> get_furthest(int node, int N){
    vis.assign(N, false);
    queue<pair<int, int>> q;
    vector<pair<int, int>> nodes;
    ll dist = 0, ret = node;
    q.push({node, 0});
    while(!q.empty()){
        pair<int, int> val = q.front();
        nodes.push_back(val);
        vis[val.first] = true;
        comp[val.first] = true;
        q.pop();
        if(val.second > dist){
            ret = val.first;
            dist = val.second;
        }
        for(pair<int, int> i : adj[val.first]){
            if(!vis[i.first]){
                parent[i.first] = val.first;
                q.push({i.first, i.second + val.second});
            }
        }
    }
    return {ret, dist};
}

ll diameter(int node, int N){
    diapath.clear(), diaedges.clear();
    int a, b, p;
    pair<int, int> dia;
    a = get_furthest(node, N).first;
    dia = get_furthest(a, N);
    b = dia.first;
    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);
    return dia.second;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    adj.resize(N), parent.resize(N), comp.resize(N);
    int bigcenter = -1, maxrad = -1;
    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]});
    }
    for(int i = 0; i < N; i++){
        if(!comp[i]){
            ll dialength = max(diameter(i, N), 0ll);
            ll c = i, p = 0, mindist = dialength;
            if(dialength > 0){
                for(int j = 0; j < diapath.size(); j++){
                    if(max(p, dialength - p) < mindist){
                        c = diapath[j];
                        mindist = max(p, dialength - p);
                    }
                    if(j < diaedges.size()) p += diaedges[j];
                }
            }
            if(mindist > maxrad){
                bigcenter = c;
                maxrad = mindist;
            }
            // cerr << endl << "center at " << c << endl;
            centers.push_back(c);
        }
    }
    for(int i : centers){
        if(i != bigcenter){
            // cerr << i << ' ';
            adj[i].push_back({bigcenter, L});
            adj[bigcenter].push_back({i, L});
        }
    }
    // cerr << endl;
    ll ret = diameter(0, N);
    return ret;
}
#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...