제출 #1336971

#제출 시각아이디문제언어결과실행 시간메모리
1336971lxz20071231Traffic (IOI10_traffic)C++20
0 / 100
1 ms344 KiB
#include <bits/stdc++.h>
// #include "grader.cpp"
#include "traffic.h"

using namespace std;

using vi = vector<int>;
using vvi = vector<vi>;
using ll = long long;
using vll = vector<ll>;

#define pb push_back

vll sz, dp1, dp2;
vvi adj;
int n;

void dfs1(int u, int par=-1){
    sz[u] = 1;
    for (int v : adj[u]){
        if (v == par) continue;
        dfs1(v, u);
        sz[u] += sz[v];
        dp1[u] += dp1[v];
        dp1[u] += sz[v];
    }
}

void dfs2(int u, int par=-1){
    dp2[u] = dp1[u];
    if (par > -1){
        dp2[u] += dp2[par] - dp1[par];
        dp2[u] += n - sz[par];
    }
    for (int v : adj[u]){
        if (v != par){
            dfs2(v, u);
        }
    }
}

int LocateCentre(int N, int pp[], int S[], int D[]) {
    n = N;

    sz = dp1 = dp2 = vll(n, 0);
    adj.assign(n, {});

    for (int i=0; i<n-1; i++){
        adj[S[i]].pb(D[i]);
        adj[D[i]].pb(S[i]);
    }

    dfs1(0);
    dfs2(0);

    int ans = 0;

    for (int i=1; i<n; i++){
        if (dp2[i] < dp2[ans]){
            ans = i;
        }
    }

    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...