Sunday, June 19, 2011

Модтой тоглоё 6

IOI2010-n 2dahi odoriin Traffic Congestion bodlogiig bodloo. tgj bgad nemelt tailbar hiinee. Source-g ni tavichii.
//Task: IOI2010_2_2
//by Dunno
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
static int N,P[1000000],S[1000000],D[1000000];
int n;
vector<int> v[1000000];
int prev[1000000];
int col[1000000];
int sum;
int *p;

int go(int x) {
int ans = p[x];
int m = 0;
for (int i = 0; i < (int) v[x].size(); i++) {
int u = v[x][i];
if (u == prev[x])
continue;
prev[u] = x;
int tmp = go(u);
m = max(m, tmp);
ans += tmp;
}
m = max(m, sum - ans);
col[x] = m;
return ans;
}

int LocateCentre(int n, int *p, int *s, int *d) {
::n = n;
::p = p;
sum = accumulate(p, p + n, 0);
for(int i=0; i<n; i++){
v[s[i]].push_back(d[i]);
v[d[i]].push_back(s[i]);
}

prev[0] = -1;
go(0);
int id = 0;
int best = col[0];
for (int i = 1; i < n; i++) {
if (col[i] < best) {
best = col[i];
id = i;
}
}

return id;
}
int main(){
int i;
freopen("grader.in","r",stdin);
freopen("grader.out","w",stdout);
scanf("%d",&N);
for (i=0;i<N;i++) scanf("%d",&P[i]);
for (i=0;i<N-1;i++) scanf("%d%d",&S[i],&D[i]);
int r = LocateCentre(N,P,S,D);
printf("%d\n",r);
return 0;
}

let me know about errors, if any