제출 #1336117

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

vector<vector<pair<int,int>>> adj;
vector<bool> visited;
vector<int> maxdist1;
vector<int> maxdist2;
int n , m , l;
int curmaxdist;


void dfs1(int cur) {
    visited[cur] = true;
    for(auto &x : adj[cur]) {
        if(visited[x.first]){
            continue;
        }
        dfs1(x.first);
        if(maxdist1[cur] < maxdist1[x.first] + x.second){
            maxdist2[cur] = maxdist1[cur];
            maxdist1[cur] =maxdist1[x.first] + x.second;
        }
        else if(maxdist2[cur] < maxdist1[x.first] + x.second) {
            maxdist2[cur] = maxdist1[x.first] + x.second;
        }
    }
}

//rerouting
void dfs2(int cur,int par){
    if(par != -1) {
        if(maxdist1[par] != maxdist1[cur] + 1) {
            maxdist1[cur] = max(maxdist1[cur], maxdist1[par] + 1);
        }
        else {
            maxdist1[cur] = max(maxdist1[cur], maxdist2[par] + 1);
        }
    }
    for(auto &x : adj[cur]) {
        if(x.first == par){
            continue;
        }
        dfs2(x.first, cur);
    }
    curmaxdist = max(curmaxdist, maxdist1[cur]);
}


int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    adj.resize(N);
    visited.resize(N);
    maxdist1.resize(N);
    maxdist2.resize(N);
    for(int i = 0;i < M ;i++) {
        adj[A[i]].push_back(pair(B[i], T[i]));
        adj[B[i]].push_back(pair(A[i], T[i]));
    }
    n = N;
    m =  M;
    l = L;


    vector<int> v;
    for(int i = 0; i < N ; i++) {
        if(!visited[i]) {
            curmaxdist = 0;
            dfs1(i);
            dfs2(i, -1);
            v.push_back(curmaxdist);
        }
    }

    sort(v.rbegin(), v.rend());
    int l = (N - 1)/ 2;
    int r = l + 1;
    int ind = 0;
    int maxright = 0;
    int maxleft = 0;
    int ans = 0;
    while(ind < N) {
        ans = max(ans, maxleft + v[ind]);
        maxright =max(maxright, v[ind] + (r - l) * L);
        l--;
        ind++;
        if(ind < N) {
            ans = max(ans , maxright + v[ind]);
            maxleft = max(maxleft, v[ind] + (r - l) * L);
            r++;
            ind++;
        }
    }
    return ans;
}
#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...