#include <iostream> #include <vector> #include <queue> using namespace std; typedef long long ll; struct galaz { ll raz; //razenie miny vector<pair<int, ll> > sas; //sasiedzi }; int main() { ios_base::sync_with_stdio(0); cin.tie(); int n; cin >> n; vector<galaz> drzewo; drzewo.resize(n); for (int i = 0; i < n; i++) { ll x; cin >> x; drzewo[i].raz = x; } for (int i = 0; i < n - 1; i++) { int a, b, c; cin >> a >> b >> c; drzewo[a-1].sas.push_back(make_pair(b-1,c)); drzewo[b-1].sas.push_back(make_pair(a-1,c)); } for (int i = 0; i < n; i++) { //cout << i << endl; int wybuch = 1; queue<pair<int, ll> > kolejka; bool* wysadzone = new bool[n]{0}; bool* unikac = new bool[n] {0}; ll zasieg = drzewo[i].raz; kolejka.push(make_pair(i, zasieg)); wysadzone[i] = 1; while (!kolejka.empty()) { pair<int,ll> a = kolejka.front(); kolejka.pop(); for (int i = 0; i < drzewo[a.first].sas.size(); i++) { if (unikac[drzewo[a.first].sas[i].first]) continue; ll x = a.second - drzewo[a.first].sas[i].second; if (x >=0) { if (x > drzewo[drzewo[a.first].sas[i].first].raz) { if (unikac[drzewo[a.first].sas[i].first] || true) kolejka.push(make_pair(drzewo[a.first].sas[i].first, x)); } else if (!wysadzone[drzewo[a.first].sas[i].first]) { if (unikac[drzewo[a.first].sas[i].first] || true) kolejka.push(make_pair(drzewo[a.first].sas[i].first, drzewo[drzewo[a.first].sas[i].first].raz)); } if (!wysadzone[drzewo[a.first].sas[i].first]) { wybuch++; wysadzone[drzewo[a.first].sas[i].first] = 1; if (drzewo[drzewo[a.first].sas[i].first].sas.size()==1) unikac[drzewo[a.first].sas[i].first] = 1; } } } } cout << wybuch<<" "; delete wysadzone, unikac; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <iostream> #include <vector> #include <queue> using namespace std; typedef long long ll; struct galaz { ll raz; //razenie miny vector<pair<int, ll> > sas; //sasiedzi }; int main() { ios_base::sync_with_stdio(0); cin.tie(); int n; cin >> n; vector<galaz> drzewo; drzewo.resize(n); for (int i = 0; i < n; i++) { ll x; cin >> x; drzewo[i].raz = x; } for (int i = 0; i < n - 1; i++) { int a, b, c; cin >> a >> b >> c; drzewo[a-1].sas.push_back(make_pair(b-1,c)); drzewo[b-1].sas.push_back(make_pair(a-1,c)); } for (int i = 0; i < n; i++) { //cout << i << endl; int wybuch = 1; queue<pair<int, ll> > kolejka; bool* wysadzone = new bool[n]{0}; bool* unikac = new bool[n] {0}; ll zasieg = drzewo[i].raz; kolejka.push(make_pair(i, zasieg)); wysadzone[i] = 1; while (!kolejka.empty()) { pair<int,ll> a = kolejka.front(); kolejka.pop(); for (int i = 0; i < drzewo[a.first].sas.size(); i++) { if (unikac[drzewo[a.first].sas[i].first]) continue; ll x = a.second - drzewo[a.first].sas[i].second; if (x >=0) { if (x > drzewo[drzewo[a.first].sas[i].first].raz) { if (unikac[drzewo[a.first].sas[i].first] || true) kolejka.push(make_pair(drzewo[a.first].sas[i].first, x)); } else if (!wysadzone[drzewo[a.first].sas[i].first]) { if (unikac[drzewo[a.first].sas[i].first] || true) kolejka.push(make_pair(drzewo[a.first].sas[i].first, drzewo[drzewo[a.first].sas[i].first].raz)); } if (!wysadzone[drzewo[a.first].sas[i].first]) { wybuch++; wysadzone[drzewo[a.first].sas[i].first] = 1; if (drzewo[drzewo[a.first].sas[i].first].sas.size()==1) unikac[drzewo[a.first].sas[i].first] = 1; } } } } cout << wybuch<<" "; delete wysadzone, unikac; } } |