제출 #231494

#제출 시각아이디문제언어결과실행 시간메모리
231494nickmet2004꿈 (IOI13_dreaming)C++11
0 / 100
63 ms14968 KiB
#include<bits/stdc++.h>
#include"dreaming.h"
#define f first
#define s second

using namespace std;

const int N = 2e5 + 500;
typedef pair<int, int> ipair;
int n , m , L;
vector<ipair> adj[N];
int dpD[N] , dpU[N];
bool vis[N];
vector<int> dist;

int MN = 2e9 + 5;
int mx1 = -1 , mx2 = -1;

void dfsU(int u , int p , int BOSS){
    for(ipair x : adj[u]){
        int v = x.f , w = x.s;
        if(v == p) continue;
        if(u == BOSS){
            if(dpD[v] + w == mx1){
                if(mx2 == -1) dpU[v] = w;
                else dpU[v] = mx2 + w;
            } else dpU[v] = mx1 + w;
        }
        else dpU[v] = dpU[u] + w;
        dfsU(v , u , BOSS);
    }
    MN = min(MN , max(dpU[u] , dpD[u]));
}
void dfsD(int u , int BOSS){
    vis[u] = 1;
    for(ipair x : adj[u]){
        int v = x.f , w = x.s;
        if(vis[v]) continue;
        dfsD(v , BOSS);
        dpD[u] = max(dpD[u] , dpD[v] + w);
        if(u == BOSS){
            if(mx2 < dpD[v] + w){mx2 = dpD[v] + w; if(mx2 > mx1) swap(mx1 , mx2);}
        }
    }
    if(u == BOSS){ dfsU(u ,-1 , BOSS);}
}
int travelTime(int N , int M , int L , int A[] , int B[] , int C[]){
    n = N; m = M; L = L;
    for(int i = 0; i < m; ++i){
        adj[A[i]].emplace_back(B[i] , C[i]);
        adj[B[i]].emplace_back(A[i] , C[i]);
    }
    for(int i = 0; i < n; ++i){
        if(!vis[i]) {
            dfsD(i , i);
            dist.emplace_back(MN);
            //cerr << MN << " mn " << endl;
            MN = 2e9; mx1 = -1; mx2 = -1;
        }
    }
    sort(dist.begin() , dist.end()); reverse(dist.begin() ,dist.end());
    return max(dist[0] + dist[1] + L , dist[1] + dist[2] + L + L);
}
/*
int main (){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m >> L;
    for(int i = 0; i < m; ++i){
        int u , v , w;
        cin >> u >> v >> w;
        adj[u].emplace_back(v, w);
        adj[v].emplace_back(u, w);
    }
    for(int i = 0; i < n; ++i){
        if(!vis[i]) {
            dfsD(i , i);
            dist.emplace_back(MN);
            //cerr << MN << " mn " << endl;
            MN = 2e9; mx1 = -1; mx2 = -1;
        }
    }
    sort(dist.begin() , dist.end()); reverse(dist.begin() ,dist.end());
    cout << max(dist[0] + dist[1] + L , dist[1] + dist[2] + L + 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...