Submission #1329968

#TimeUsernameProblemLanguageResultExecution timeMemory
1329968moondarksideRace (IOI11_race)C++20
0 / 100
1 ms344 KiB
#include<bits/stdc++.h>
using namespace std;

std::vector<bool>Active;
std::vector<bool>Visited;
vector<vector<pair<int,int>>> Edges;
int n,k;
int opt=1000000000;

int getAm(int parent,int root){
    Visited[root]=false;
    int am=1;
    for(int i=0;i<Edges[root].size();i++){
        
        if(Active[Edges[root][i].first] && Edges[root][i].first!=parent ){
            am+=getAm(root,Edges[root][i].first);
        }
        
    }
    return am;
}

int getCentroid(int parent,int root,int Total,int& centroid){
    
    int am=1;
    int maxi=0;
    for(int i=0;i<Edges[root].size();i++){
        
        if(Active[Edges[root][i].first] && Edges[root][i].first!=parent){
            int k=getCentroid(root,Edges[root][i].first,Total,centroid);
            am+=k;
            maxi=max(maxi,k);
        }
        
    }
    if(maxi<=(Total+1)/2 && (Total-am)<=((Total+1)/2)){
        
        centroid=root;
        
    }
    
    return am;
    
    
}


void getDfsDists(int parent,int root,int dist,map<int,int>& NewD,int els){
    
    if(NewD[dist]==0){
        NewD[dist]=els;
    }
    NewD[dist]=min(NewD[dist],els);
    
    for(int i=0;i<Edges[root].size();i++){
        
        if(Active[Edges[root][i].first] && Edges[root][i].first!=parent){
            getDfsDists(root,Edges[root][i].first,dist+Edges[root][i].second,NewD,els);
        }
        
    }
    
    return;
    
    
}


void checkPossible(int n){
    
    int centroid;
    getCentroid(-1,n,getAm(-1,n),centroid);
    map<int,int> Dists;
    Dists[0]=1;
    
    
    for(int i=0;i<Edges[centroid].size();i++){
        map<int,int> NewDists;
        if(Active[Edges[centroid][i].first]){
            getDfsDists(centroid,Edges[centroid][i].first,Edges[centroid][i].second,NewDists,2);
        }
        
        for(auto j : NewDists){
            
            int dist=j.first;
            int val=j.second;
            
            if(Dists[k-dist]!=0){
                opt=min(opt,val+Dists[k-dist]-2);
            }
            
            
        }
        
        for(auto j : NewDists){
            
            int dist=j.first;
            int val=j.second;

            
            if(Dists[dist]==0){
                Dists[dist]=val;
            }
            Dists[dist]=min(val, Dists[dist]);
            
            
        }
        
    }
    
    Active[centroid]=false;
    
    
    
}


void getBest(){
    for(int j=0;j<80;j++){
        Visited=vector<bool>(n,true);
    for(int i=0;i<n;i++){
        if(Visited[i] && Active[i]){
            checkPossible(i);
        }
    }
    }
    
    
    
}


int best_path(int N, int K, int H[][2], int L[]){
    n=N;k=K;
    Active=vector<bool> (N,true);
    Edges=vector<vector<pair<int,int>>>(N);
    for(int i=0;i<N-1;i++){
        
        Edges[H[i][0]].push_back({H[i][1],L[i]});
        Edges[H[i][1]].push_back({H[i][0],L[i]});
        
        
    }
    getBest();
    if(opt!=1000000000){
        return opt;
    }
    return -1;
    
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...