Madiyar

Untitled

Mar 15th, 2012
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstdlib>
  5. #include <vector>
  6. #include <set>
  7. #include <map>
  8. #include <cassert>
  9. #include <ctime>
  10. #include <cmath>
  11. #include <string>
  12. #include <cstring>
  13. #include <queue>
  14. using namespace std;
  15.  
  16. #define f first
  17. #define s second
  18. #define mp make_pair
  19. #define pb push_back
  20. #define pii pair<int, int>
  21. #define vi vector<int>
  22. #define all(v) (v).begin(), (v).end()
  23. #define forit(it,v) for (typeof(v.begin()) it = v.begin(); it != v.end(); ++it)
  24. #define f0(a) memset(a, 0, sizeof(a))
  25.  
  26. const int maxn = 200000;
  27. long long ans[maxn];
  28. int n, k[maxn];
  29. vi g[maxn];
  30.  
  31.  
  32. void Dfs(int v, int parent) {
  33.    
  34.     vector<int> vec;
  35.  
  36.     ans[v] = 0;
  37.  
  38.     forit(it, g[v]) {
  39.         int to = *it;
  40.        
  41.         if (to != parent) {
  42.             k[to]--;           
  43.             Dfs(to, v);        
  44.             vec.pb(ans[to]);
  45.         }
  46.     }
  47.     sort(all(vec));
  48.     reverse(all(vec));    
  49.  
  50.     long long sum = vec.size();
  51.     for (int i = 0; k[v] > 0 && i < vec.size(); ++i) {
  52.         ans[v] += vec[i] + 1;
  53.         sum--;
  54.         k[v]--;
  55.  
  56.     }
  57.    
  58.     forit(it, g[v]) {
  59.         int to = *it;
  60.         if (to != parent)
  61.             sum += k[to];
  62.     }
  63.  
  64.     if (v == 5) cerr << sum << endl;
  65.  
  66.     long long tmp = min(1ll * k[v], sum);
  67.  
  68.     ans[v] += 2*tmp;
  69.  
  70.     k[v] -= tmp;
  71. }
  72.  
  73.  
  74. int main() {
  75.     #ifdef LOCAL
  76.         freopen("in", "r", stdin);
  77.         freopen("out", "w", stdout);
  78.     #endif
  79.     scanf("%d", &n);
  80.  
  81.     for (int i = 1; i <= n; ++i)
  82.         scanf("%d", &k[i]);
  83.  
  84.     for (int i = 0; i < n - 1; ++i) {
  85.         int u, v;
  86.         scanf("%d%d", &u, &v);     
  87.         g[u].pb(v);
  88.         g[v].pb(u);
  89.     }
  90.  
  91.     int start;
  92.     scanf("%d", &start);
  93.     Dfs(start, -1);
  94.     cout << ans[start]  << endl;
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment