Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <algorithm>
- #include <queue>
- #include <vector>
- #include <set>
- using namespace std;
- int i,j,n,m,k,a,b;
- struct skolas{
- long long val;
- set<int> adj;
- }sk[100001];
- struct node{
- long long val;
- int id;
- node(long long _val,int _id){
- val = _val;
- id = _id;
- }
- };
- bool cmp(node a,node b){
- if(a.val!=b.val) return a.val > b.val;
- else return a.id < b.id;
- }
- set<int> s;
- set<int>::iterator it;
- priority_queue<node,vector<node>,bool(*)(node,node)> pq(cmp);
- int procceed(){
- int ID;
- long long VAL;
- while(!pq.empty()){
- //VAL = sk[ID].val;
- ID = pq.top().id;
- pq.pop();
- sk[*sk[ID].adj.begin()].val+=sk[ID].val;
- sk[*sk[ID].adj.begin()].adj.erase(ID);
- if(sk[*sk[ID].adj.begin()].adj.size()==1){
- pq.push(node(sk[*sk[ID].adj.begin()].val,*sk[ID].adj.begin()));
- }
- }
- return ID;
- }
- int main()
- {
- freopen("skola.in","r",stdin);
- freopen("skola.out","w",stdout);
- scanf("%d",&n);
- for(i=1;i<=n;i++){
- scanf("%d",&sk[i].val);
- }
- for(i=1;i<n;i++){
- scanf("%d%d",&a,&b);
- sk[a].adj.insert(b);
- sk[b].adj.insert(a);
- if(sk[a].adj.size()==1) s.insert(a);
- else s.erase(a);
- if(sk[b].adj.size()==1) s.insert(b);
- else s.erase(b);
- }
- for(it=s.begin();it!=s.end();it++){
- pq.push(node(sk[*it].val,*it));
- }
- printf("%d",procceed());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement