제출 #1329972

#제출 시각아이디문제언어결과실행 시간메모리
1329972moondarksideRace (IOI11_race)C++20
컴파일 에러
0 ms0 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)/2 && (Total-am)<=((Total)/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+1);
        }
        
    }
    
    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;
    
}


signed main(){
    
    int H[][2]={{0,1},
{0,2},
{2,3},
{3,4},
{4,5},
{0,6},
{6,7},
{6,8},
{8,9},
{8,10}
};
    int L[]={3,
4,
5,
4,
6,
3,
2,
5,
6,
7
};
    
    cout<<best_path(11,12,H,L);
}

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/ccR2j30o.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/cckkicRX.o:race.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status