제출 #1355002

#제출 시각아이디문제언어결과실행 시간메모리
1355002kmath628꿈 (IOI13_dreaming)C++20
18 / 100
28 ms11260 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
vector<pair<int,int> > graph[100000];
int cnt,opt,mx,ch[100000],D[100000];
void dist(int v, int d){
    if(d>mx) opt=v,mx=d;
    ch[v]=cnt,D[v]=d;
    for(auto [u,c]: graph[v]){
        if(ch[u]!=cnt) dist(u,d+c);
    }
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    int i,u,v;
    vector<int> d;
    for(i=0;i<M;i++){
        graph[A[i]].push_back({B[i],T[i]});
        graph[B[i]].push_back({A[i],T[i]});
    }
    for(i=0;i<N;i++){
        if(ch[i]) continue;
        cnt++,mx=-1,dist(i,0);
        u=opt;
        cnt++,mx=-1,dist(u,0);
        v=opt;
        //printf("i=%d u=%d v=%d\n",i,u,v);
        int mn=mx;
        while(v!=u){
            for(auto [v2,c]: graph[v]){
                if(D[v2]==D[v]-c){
                    v=v2;
                    break;
                }
            }
            mn=min(mn,max(D[v],mx-D[v]));
        }
        d.push_back(-mn);
    }
    sort(d.begin(),d.end());
    assert(d.size()==N-M);
    if(M==N-1) return mx;
    if(M==N-2) return -d[0]-d[1]+L;
    return max(-d[0]-d[1]+L,-d[1]-d[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...