제출 #1207339

#제출 시각아이디문제언어결과실행 시간메모리
1207339spetrHarbingers (CEOI09_harbingers)C++20
20 / 100
1096 ms35568 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define vl vector<long long>
#define vll vector<vector<long long>>



int main(){
    ios::sync_with_stdio(false);cin.tie(NULL);

    ll n;
    cin >> n;

    vll graf;
    map<vl,ll> ceny;
    vll posta {{0,0,0,0}};
    for (ll i = 0; i < n; i++){
        graf.push_back({});
    }

    for (ll i = 0; i < n-1; i++){
        ll a,b,c;
        cin >> a >> b >> c;
        graf[a-1].push_back(b-1);
        graf[b-1].push_back(a-1);
        ceny[{a-1,b-1}] = c;
        ceny[{b-1,a-1}] = c;

    }

    for (ll i = 0; i < n-1; i++){
        ll a,b;
        cin >> a >> b;
        posta.push_back({a,b,-1,0}); // pointer zpět a skore
    }

    vl zasobnik {0};
    set<ll> mnozina;

    while (zasobnik.size() > 0){
        ll prvek = zasobnik[zasobnik.size()-1];
        zasobnik.pop_back();
        auto visited = mnozina.find(prvek);

        if (visited == mnozina.end()){
            mnozina.insert(prvek);
            for (ll i = 0; i < graf[prvek].size(); i++){
                auto je = mnozina.find(graf[prvek][i]);
                if (je == mnozina.end()){
                    posta[graf[prvek][i]][2] = prvek;
                    zasobnik.push_back(graf[prvek][i]);
                }
            }

            ll pos = prvek;
            ll distance = 0;
            ll optimum = 1000000000;
            while (pos != 0){
                distance += ceny[{pos, posta[pos][2]}];
                pos = posta[pos][2];
                optimum = min(optimum, distance*posta[prvek][1] + posta[prvek][0] + posta[pos][3]);

            }
            optimum = min(optimum,  distance*posta[prvek][1] + posta[prvek][0]);
            posta[prvek][3] = optimum;
        }
    }
    for (ll i = 1; i < n; i++){
        cout << posta[i][3] << " ";
    }

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