Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define sz(a) int((a).size())
- #define pb push_back
- #define all(c) (c).begin(),(c).end()
- #define tr(c,i) for(typeof((c).begin() i = (c).begin(); i != (c).end(); i++)
- #define present(c,x) ((c).find(x) != (c).end())
- #define cpresent(c,x) (find(all(c),x) != (c).end())
- #define LSOne(i) (i&(-i))
- #define rep(i,a,b) for(int(i)=(a);(i)<(b);i++)
- #define BUG(x) {cout<<#x<<" = "<<x<<endl;}
- #define left(x) (x<<1)
- #define right(x) ((x<<1) +1)
- #define middle(s,e)(s+(e-s)/2)
- #define size_tree(n) 2*(int)pow(2,ceil(log2(n)))
- #define CL(A,I) (memset(A,I,sizeof(A)))
- #define endl '\n'
- #define PHAS(_n) (pbits[(_n)>>5] & (1u << ((_n) & 0x1f)))
- #define PSET(_n) (pbits[(_n)>>5] |= (1u << ((_n) & 0x1f)))
- //unsigned int pbits[200000000/32+1];
- static const int INF = 0x3f3f3f3f;
- static const long long INFL = 0x3f3f3f3f3f3f3f3fLL;
- static const long double epsilon = 1e-15;
- static const long double pi = acos((long double) -1);
- using namespace std;
- inline void init_io(){ios_base::sync_with_stdio(false);cin.tie(NULL);}
- typedef vector<int> vi;
- typedef vector<vi> vvi;
- typedef pair<int,int> ii;
- typedef long long ll;
- const int N = 100001;
- vector<int> tree[N];
- int w[N], par[N], child[N];
- // struct data{
- // int weight;
- // int idx;
- // data():weight(0), idx(0){};
- // data(int w, int i) : weight(w), idx(i){};
- // bool operator < (data other) const {
- // return weight > other.weight;
- // }
- // };
- // priority_queue<data> pq;
- priority_queue<pair<ll,int>, vector<pair<int,int> >, greater<pair<int,int> > > pq;
- void dfs(int u,int p)
- {
- rep(i,0,tree[u].size())
- {
- int v = tree[u][i];
- if(v==p) continue;
- par[v] = u ;
- dfs(v,u);
- }
- if(tree[u].size()==1)
- pq.push({w[u],u});
- }
- int main()
- {
- int n,k,u,v;
- cin>>n>>k;
- long res = 0;
- rep(i,0,n)
- {
- cin>>w[i];
- res +=w[i];
- }
- rep(i,0,n-1)
- {
- cin>>u>>v;
- u--;v--;
- tree[u].pb(v);
- tree[v].pb(u);
- }
- rep(i,0,n)
- child[i] = tree[i].size()-1;
- dfs(0,-1);
- rep(i,0,k)
- {
- pair<int,int> pp = pq.top();
- pq.pop();
- res-= pp.first;
- child[par[pp.second]]--;
- if(!child[par[pp.second]])
- pq.push({w[par[pp.second]],par[pp.second]});
- }
- cout<<res<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement