Submission #760300

#TimeUsernameProblemLanguageResultExecution timeMemory
760300raysh07Dreaming (IOI13_dreaming)C++17
100 / 100
71 ms14568 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;

int n, m, l;
const int N = 1e5 + 69;
vector <pair<int, int>> adj[N];
vector <int> comp;
bool vis[N];
int dist[N], mx[N];

void dfs(int u){
    vis[u] = true;
    comp.push_back(u);
    for (auto [v, w] : adj[u]){
        if (!vis[v]) dfs(v);
    }
}

void bfs(int i){
    for (auto x : comp) dist[x] = -1;
    
    dist[i] = 0;
    
    queue <int> q;
    q.push(i);
    
    while (!q.empty()){
        int u = q.front();
        q.pop();
        
        for (auto [v, w] : adj[u]){
            if (dist[v] == -1){
                dist[v] = dist[u] + w;
                q.push(v);
            }
        }
    }
    
    for (auto x : comp) mx[x] = max(mx[x], dist[x]);
}

int get(){
    pair<int, int> best = make_pair(-1, -1);
    for (auto x : comp){
        best = max(best, make_pair(dist[x], x));
    }
    
    return best.second;
}

int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    n = N; m = M; l = L;
    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]});
    }
    
    int ans = 0;
    vector <int> ok;
    for (int i = 0; i < n; i++){
        if (vis[i]) continue;
        comp.clear();
        dfs(i);
        
        bfs(i);
        int g1 = get();
        bfs(g1);
        int g2 = get();
        bfs(g2);
        
        int mn = 1e9;
        for (auto x : comp) mn = min(mn, mx[x]);
        int ma = -1;
        for (auto x : comp) ma = max(ma, mx[x]);
        
        ans = max(ans, ma);
        ok.push_back(mn);
    }
    
    sort(ok.begin(), ok.end(), greater<int>());
    if (ok.size() == 2){
        ans = max(ans, l + ok[0] + ok[1]);
    } else if (ok.size() >= 3){
        ans = max(ans, l + ok[0] + ok[1]);
        ans = max(ans, 2 * l + ok[1] + ok[2]);
    }
    
    return ans;
} 

// int main(){
//     int n, m, l; cin >> n >> m >> l;
    
//     int a[m], b[m], t[m];
//     for (int i = 0; i < m; i++) cin >> a[i] >> b[i] >> t[i];
//     cout << travelTime(n, m, l, a, b, t);
    
//     return 0;
// }
#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...