Submission #1338661

#TimeUsernameProblemLanguageResultExecution timeMemory
1338661JungPSDreaming (IOI13_dreaming)C++20
0 / 100
50 ms17088 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;

vector<pair<long long,long long>> vec[100007];;
vector<long long> group[100007];
vector<pair<long long,long long>> tans;
long long mark[100007];
long long dist[100007][3];
long long grun;
long long mxidx;
bool visited[100007];
void dfs(long long x){
    group[grun].push_back(x);
    mark[x]=grun;
    for(auto i:vec[x]){
        if(!mark[i.first]){
            dfs(i.first);
        }
    }
}

void bfs(long long x,long long channel){
    for(auto i:group[mark[x]]){
        dist[i][channel]=1e18;
        visited[i]=0;
    }
    priority_queue<pair<long long,long long>,vector<pair<long long,long long>>,greater<pair<long long,long long>>> pq;
    while(!pq.empty()) pq.pop();
    dist[x][channel]=0;
    pq.push({0,x});
    while(!pq.empty()){
        long long dis=pq.top().first;
        long long node=pq.top().second;
        pq.pop();
        for(auto i:vec[node]){
            if(dis+i.second<dist[i.first][channel]){
                dist[i.first][channel]=dis+i.second;
                pq.push({dist[i.first][channel],i.first});
            }
        }
    }
    long long mx=0;
    for(auto i:group[mark[x]]){
        if(dist[i][channel]>mx){
            mx=dist[i][channel];
            mxidx=i;
        }
    }
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
    for(int i=1;i<=N;++i){
        vec[i].clear();
        group[i].clear();
        mark[i]=0;
        grun=1;
        visited[i]=0;
        dist[i][0]=dist[i][1]=dist[i][2]=0;
    }
    tans.clear();
    for(long long i=0;i<M;++i){
        vec[A[i]].push_back({B[i],T[i]});
        vec[B[i]].push_back({A[i],T[i]});
    }
    for(long long i=1;i<=N;++i){
        if(!mark[i]){
            dfs(i);
            ++grun;
        }
    }
    for(long long i=1;i<grun;++i){
        bfs(group[i][0],0);
        bfs(mxidx,1);
        bfs(mxidx,2);
        long long mn=1e18,mnidx;
        for(auto j:group[i]){
            if(max({dist[j][0],dist[j][1],dist[j][2]})<mn){
                mn=max({dist[j][0],dist[j][1],dist[j][2]});
                mnidx=j;
            }
        }
        tans.push_back({mn,mnidx});
    }
    sort(tans.begin(),tans.end());
    reverse(tans.begin(),tans.end());
    if(tans.size()==1) return tans[0].first;
    else return tans[0].first+L+tans[1].first;
}
#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...