제출 #1323643

#제출 시각아이디문제언어결과실행 시간메모리
1323643ChottuFDreaming (IOI13_dreaming)C++20
100 / 100
71 ms17724 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5+5;
const int INF = 1e9;
int dist[2][MAXN];
bool vis[MAXN];
vector<pair<int,int>> adj[MAXN];
vector<int> cr;

int c = 0;

void dfs(int x, int p, bool flag){
    vis[x] = true;
    if (flag) cr.push_back(x);
    for (auto v : adj[x]){
        auto [u, w] = v;
        if (u == p) continue;
        dist[c][u] = dist[c][x] + w;
        dfs(u,x,flag);
    }
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    for (int i = 0; i<N; i++){
        dist[0][i] = INF;
        dist[1][i] = INF;
        vis[i] = false;
    }
    for (int i = 0; i<M; i++){
        int a = A[i];
        int b = B[i];
        int w = T[i];
        adj[a].push_back({b,w});
        adj[b].push_back({a,w});
    }
    //dfs i -> 0
    int overall = -1;
    vector<int> radd;
    for (int i = 0; i<N; i++){
        if (!vis[i]){
            dist[c][i] = 0;
            dfs(i,-1,1);
            int v = i;
            for (auto u : cr){
                if (dist[c][u] > dist[c][v]){
                    v = u;
                }
            }
            dist[c][v] = 0;
            dfs(v,-1,0);
            int u = i;
            for (auto qq : cr){
                if (dist[c][qq] > dist[c][u]){
                    u = qq;
                }
            }
            
            int diam = dist[0][u];
            overall = max(overall, diam);
            c = 1;
            dist[c][u] = 0;
            dfs(u, -1, 0);
            c = 0;
            
            
            
            int bst = INF;
            int idx = -1;
            
            for (auto qq : cr){
                int one = max(dist[0][qq], dist[1][qq]);
                if (one < bst){
                    bst = one;
                    idx = qq;
                }
            }
            radd.push_back(bst);
            cr.clear();
        }
    }
    sort(radd.begin(),radd.end());
    reverse(radd.begin(), radd.end());
    
    int k = radd.size();
    if (k >= 2){
        overall = max(overall,radd[0] + L + radd[1]);
    }
    if (k >= 3){
        overall = max(overall,radd[1] + L + radd[2] + L);
    }
    
    for (int i = 0; i<N; i++) adj[i].clear();
    
    return overall;
}
#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...