| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 1154805 | njoop | Dreaming (IOI13_dreaming) | C++17 | 0 ms | 0 KiB | 
#include "dreaming.h"
#include <bits/stdc++.h>
#define ti tuple<int, int, int>
using namespace std;
vector<pair<int, int>> g[100010];
vector<int> dis;
priority_queue<ti, vector<ti>, greater<ti>> pq;
int cno, cpa, cdi, nno, ndi, disa[100010], disb[100010], ans;
bool vi[100010];
int findMxRoot(int rt) {
    vector<int> no;
    int a, b;
    pq.push({0, rt, -1});
    while(pq.size()) {
        cdi = get<0>(pq.top());
        cno = get<1>(pq.top());
        cpa = get<2>(pq.top());
        pq.pop();
        a = cno;
        vi[cno] = 1;
        no.push_back(cno);
        for(auto i: g[cno]) {
            nno = i.first;
            ndi = cdi + i.second;
            if(cpa == nno) continue;
            pq.push({ndi, nno, cno});
        }
    }
    pq.push({0, a, -1});
    while(pq.size()) {
        cdi = get<0>(pq.top());
        cno = get<1>(pq.top());
        cpa = get<2>(pq.top());
        pq.pop();
        b = cno;
        disa[cno] = cdi;
        for(auto i: g[cno]) {
            nno = i.first;
            ndi = cdi + i.second;
            if(cpa == nno) continue;
            pq.push({ndi, nno, cno});
        }
    }
    pq.push({0, b, -1});
    while(pq.size()) {
        cdi = get<0>(pq.top());
        cno = get<1>(pq.top());
        cpa = get<2>(pq.top());
        pq.pop();
        disb[cno] = cdi;
        for(auto i: g[cno]) {
            nno = i.first;
            ndi = cdi + i.second;
            if(cpa == nno) continue;
            pq.push({ndi, nno, cno});
        }
    }
    int mxrt = 2e9;
    for(int i: no) {
        mxrt = min(mxrt, max(disa[i], disb[i]));
    }
    return mxrt;
}
int travelTime(int N, int M, int L, vector<int> A, vector<int> B, vector<int> T) {
    for(int i=0; i<M; i++) {
        g[B[i]].push_back({A[i], T[i]});
        g[A[i]].push_back({B[i], T[i]});
    }
    for(int i=0; i<N; i++) {
        if(!vi[i]) dis.push_back(findMxRoot(i));
    }
    sort(dis.begin(), dis.end());
    int sz = dis.size();
    if(sz == 1) ans = dis[0];
    else if(sz == 2) ans = dis[0] + L + dis[1];
    else ans = max(dis[sz-2]+dis[sz-3]+2*L, dis[sz-1]+dis[sz-2]+L);
    return ans;
}
