제출 #1347141

#제출 시각아이디문제언어결과실행 시간메모리
1347141frogrammerTraffic (IOI10_traffic)C++20
100 / 100
382 ms223500 KiB
#include "traffic.h"
#include <bits/stdc++.h>
using namespace std;

long long getSubTree(int nodo, int P[], int padre, vector<long long>& subtrees, vector<vector<int>>& adj, vector<long long>& maxRoad, long long total){
    if(subtrees[nodo]!=-1) return subtrees[nodo];
    long long suma = 0;
    for(int i=0;i<adj[nodo].size();i++){
        if(adj[nodo][i]==padre) continue;
        long long subtree = getSubTree(adj[nodo][i], P, nodo, subtrees, adj, maxRoad, total);
        suma += subtree;
        maxRoad[nodo] = max(maxRoad[nodo],subtree);
    }
    maxRoad[nodo] = max(maxRoad[nodo],total-suma-P[nodo]);
    subtrees[nodo] = suma+P[nodo];
    return subtrees[nodo];
}

int LocateCentre(int N, int P[], int S[], int D[]) {
    vector<vector<int>> adj(N);
    vector<long long> subtree(N,-1);
    vector<long long> maxRoad(N,0);
    long long suma = 0;

    for(int i=0;i<N-1;i++){
        int u = S[i];
        int v = D[i];
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for(auto i=0;i<N;i++) suma+=P[i];
    getSubTree(0,P,-1,subtree, adj, maxRoad, suma);

    long long minRoad = maxRoad[0];
    int idx = 0;
    
    //cout<<suma<<endl;
    //for(int i=0;i<N;i++) cout<<i<<" "<<maxRoad[i]<<" "<<subtree[i]<<endl;
    for(int i=1;i<N;i++){
        if(maxRoad[i]<minRoad){
            minRoad = maxRoad[i];
            idx = i;
        }
    }
    return idx;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...