# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1207294 | chambi | Traffic (IOI10_traffic) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int maximo= 1000005;
vector<int>conexiones[maximo];
vector<int>fanaticos;
vector<long long>s_fanaticos;
int N;
long long t_fanaticos=0;
int mejor_ciudad=-1;
void calcular(int ciudad, int padre){
suma_fanaticos[ciudad]=fanaticos[ciudad];
for(int vecino:conexiones[ciudad]){
if(vecino==padre){
continue;
}
calcular(vecino, ciudad);
s_fanaticos[ciudad]+=s_fanaticos[vecino];
}
}
void centro(int ciudad, int padre){
bool es_centro=true;
for(int vecino:conexiones[ciudad]){
if(vecino==padre){
continue;
}
if(s_fanaticos[vecino]>t_fanaticos/2){
es_centro=false;
centro(vecino, ciudad);
return;
}
long long fuera= t_fanaticos-s_fanaticos[ciudad];
if(fuera>t_fanaticos/2){
es_centro=false;
centro(vecino, ciudad);
return;
}
if(centro){
mejor_ciudad=ciudad;
}
}
}
int LocateCenter(int n, vector<int>&P, vector<int>&S, vector<int>&D){
N=n;
fanaticos=P;
s_fanaticos.assign(N, 0);
t_fanaticos=0;
mejor_ciudad=-1;
for(int i=0; i<N-1; i++){
conexiones[S[i]].push_back(D[i]);
conexiones[D[i]].push_back(S[i]);
}
for(int f:P){
t_fanaticos+=f;
}
calcular(0, -1);
centro(0, -1);
return mejor_ciudad;
}