제출 #487132

#제출 시각아이디문제언어결과실행 시간메모리
487132Spade1Traffic (IOI10_traffic)C++14
100 / 100
884 ms152944 KiB
#include <bits/stdc++.h>
#include "traffic.h"
#define ll long long
#define pii pair<int, int>
#define st first
#define nd second
#define pb push_back
using namespace std;

const int maxN = 1e6 + 10; //maximum number of N possible

vector<int> adj[maxN]; // adjacency list of the tree
int prt[maxN], dis[maxN]; // prt contains parent of the node dis contains the sum of people in lower nodes (and also in itself)

void dfs(int i, int p) {
    //loop through all neighbors
    for (auto j : adj[i]) {
        //if j is the parent just ignore it
        if (j == p) continue;
        //recursion call, run dfs at node j to find dis[j]
        dfs(j, i);
        //after getting dis[j] add dis[j] to dis[i]
        dis[i] += dis[j];
        //set parent of j to be i
        prt[j] = i;
    }
}

int LocateCentre(int N, int P[], int S[], int D[]) {
    for (int i = 0; i < N - 1; ++i) {
        //initializing the adjacency list
        adj[S[i]].pb(D[i]);
        adj[D[i]].pb(S[i]);
    }

    for (int i = 0; i < N; ++i) {
        //set all dis to be their own number
        dis[i] = P[i];
    }

    //start dfs to gain dis and prt we'll let 0 be the root node and 0 will have no parent so just put in -1
    dfs(0, -1);

    //set ans to max possible number of people
    //c will contains the centre with min traffic jam
    int ans = 2e9, c;

    for (int i = 0; i < N; ++i) {
        //let tmp = 0, tmp will be the max number of dis going out of node i
        //note that we only need to check the nodes that is neighbors of node i for the max people in traffic
        int tmp = 0;
        for (auto j : adj[i]) {
            //if j is parent people going to to node j is sum of people - people that didn't go to j
            if (j == prt[i]) tmp = max(tmp, dis[0] - dis[i] );
            //else it's just the dis that we maintain
            else tmp = max(tmp, dis[j]);
            // use max to find the maximum traffic jam if the centre is at i
        }
        //if the tmp is less than our ans, we change the c (the centre) and the ans
        if (tmp < ans) c = i, ans = tmp;
    }

    return c;
}

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

traffic.cpp: In function 'int LocateCentre(int, int*, int*, int*)':
traffic.cpp:63:12: warning: 'c' may be used uninitialized in this function [-Wmaybe-uninitialized]
   63 |     return c;
      |            ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...