Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- struct struk
- {
- int cvor;
- int k;
- };
- inline bool operator <(const struk& a, const struk& b)
- {
- return a.k < b.k;
- }
- multiset<struk> kraj;
- int dani[100010];
- int refresh[100010];
- int otac[100010];
- vector<int> graf[100010];
- int qu[100010];
- int brVeza[100010];
- int q = 0;
- vector<int> resenje;
- void bfs(int x)
- {
- qu[q++] = x;
- refresh[x] = dani[x];
- for(int i=0; i < q;i++)
- {
- int cvor = qu[i];
- for(int j = 0; j < graf[cvor].size(); j++)
- {
- int dodatiCvor = graf[cvor][j];
- qu[q++] = dodatiCvor;
- if(refresh[otac[dodatiCvor]] - 1 < dani[dodatiCvor])
- refresh[dodatiCvor] = refresh[otac[dodatiCvor]] - 1;
- else
- refresh[dodatiCvor] = dani[dodatiCvor];
- }
- }
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- int n;
- cin >> n;
- for(int i = 1; i <= n; i++) cin >> dani[i];
- for(int i = 0; i < n - 1; i++)
- {
- int p,q;
- cin >> p >> q;
- graf[p].push_back(q);
- otac[q] = p;
- brVeza[p]++;
- }
- int glava = 1;
- while(otac[glava] != 0) glava = otac[glava];
- bfs(glava);
- //for(int i = 1; i <= n; i++) cout << i << ":" << refresh[i] << "\n";
- for(int i=1; i <=n; i++)
- {
- if(brVeza[i]==0)
- {
- struk pom;
- pom.k = refresh[i];
- pom.cvor = i;
- kraj.insert(pom);
- }
- }
- int br = 1;
- //for(int i=1;i<=n;i++) cout << refresh[i] << " ";
- while(true)
- {
- //for(int i=1;i<=n;i++) cout << brVeza[i] << " ";
- //cout << br << endl;
- if(kraj.size()==0) break;
- struk prvi = *kraj.begin();
- //cout << prvi.k << " " << prvi.cvor << endl;
- if(prvi.k - br < 0) {cout << "Pobedila je crna magija"; return 0;}
- resenje.push_back(prvi.cvor);
- brVeza[otac[prvi.cvor]]--;
- struk cvorZaBrisanje = prvi;
- kraj.erase(kraj.begin());
- if(brVeza[otac[cvorZaBrisanje.cvor]] == 0)
- {
- int noviCvor = otac[cvorZaBrisanje.cvor];
- struk pom;
- pom.k = refresh[noviCvor];
- pom.cvor = noviCvor;
- kraj.insert(pom);
- }
- br++;
- }
- for(int i = 0; i < resenje.size();i++) cout << resenje[i] << " ";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement