제출 #1312626

#제출 시각아이디문제언어결과실행 시간메모리
1312626niwrad꿈 (IOI13_dreaming)C++20
18 / 100
35 ms15560 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
vector<vector<pair<int, int>>> graph;
vector<vector<pair<int, int>>> dis;
vector<int> vis;
vector<int> sp;

int dfs(int node, pair<int, int> prev) {
    vis[node] = 1;
    for (auto edge : graph[node]) {
        if (edge.first != prev.first) {
            pair<int, int> check = {edge.second + dfs(edge.first, {node, edge.second}), edge.first};
            if (check > dis[node][0]) {
                swap(check, dis[node][0]);
            }
            if (check > dis[node][1]) {
                swap(check, dis[node][1]);
            } 
        }
    }
    return dis[node][0].first;
}

int dfs1(int node, pair<int, int> prev) {
    if (prev.first != -1) {
        int val = 0;
        int par = prev.first;
        if (dis[par][0].second != node) {
            val = dis[par][0].first + prev.second;
        } else {
            val = dis[par][1].first + prev.second;
        }
        pair<int, int> check = {val, par};
        if (check > dis[node][0]) {
            swap(check, dis[node][0]);
        }
        if (check > dis[node][1]) {
            swap(check, dis[node][1]);
        } 
    }
    int mn = dis[node][0].first;
    for (auto edge : graph[node]) {
        if (edge.first != prev.first) {
            mn = min(mn, dfs1(edge.first, {node, edge.second}));
        }
    }
    return mn;
}



int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    graph.resize(N);
    vis.resize(N);
    dis.resize(N, vector<pair<int, int>>(2, {0, -1}));
    for (int i = 0; i < M; i++) {
        graph[A[i]].push_back({B[i], T[i]});
        graph[B[i]].push_back({A[i], T[i]});
    }
    for (int i = 0; i < N; i++) {
        if (!vis[i]) {
            dfs(i, {-1, -1});
            sp.push_back(dfs1(i, {-1, -1}));
        }
    }
    sort(sp.begin(), sp.end(), greater<int>());
    if (sp.size() == 1) {
        return sp[0];
    } else if (sp.size() == 2) {
        return sp[0] + sp[1] + L;
    } else {
        return max(sp[0] + sp[1] + L, sp[1] + sp[2] + 2 * L);
    }
}
#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...