Advertisement
add1ctus

Политички Партии

Jul 3rd, 2015
302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <vector>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <utility>
  6.  
  7. using namespace std;
  8.  
  9. vector<int> bruteforce[50000];
  10.  
  11. struct Node
  12. {
  13.     Node* parent;
  14.     vector<Node*> children;
  15.     long long sum;
  16.     long long power;
  17.     bool deleted;
  18.  
  19.     void calculateSubtree()
  20.     {
  21.         sum=power;
  22.         for(int i=0;i<children.size();++i)
  23.         {
  24.             children[i]->calculateSubtree();
  25.             sum+=children[i]->sum;
  26.         }
  27.     }
  28.  
  29.     void addChild(Node* child)
  30.     {
  31.         children.push_back(child);
  32.     }
  33.  
  34.     void setParent(Node* p)
  35.     {
  36.         parent=p;
  37.     }
  38.  
  39.     void changeParentSum(long long n)
  40.     {
  41.         sum-=n;
  42.         if(parent!=NULL)
  43.             parent->changeParentSum(n);
  44.     }
  45.  
  46.     void deleteIt()
  47.     {
  48.         for(int i=0;i<children.size();++i)
  49.             children[i]->deleteIt();
  50.         changeParentSum(sum);
  51.         deleted=true;
  52.     }
  53.  
  54. };
  55.  
  56. Node nodes[50000];
  57. bool found[50000];
  58.  
  59. void reconstruct(int n)
  60. {
  61.     if(found[n])
  62.         return;
  63.     found[n]=true;
  64.     for(int i=0;i<bruteforce[n].size();++i)
  65.     {
  66.         if(!found[bruteforce[n][i]])
  67.         {
  68.             nodes[n].addChild(&nodes[bruteforce[n][i]]);
  69.             nodes[bruteforce[n][i]].setParent(&nodes[n]);
  70.             reconstruct(bruteforce[n][i]);
  71.         }
  72.     }
  73. }
  74.  
  75. int main()
  76. {
  77.     memset(found,false,sizeof(found));
  78.     int n,k,a,b;
  79.     scanf("%d%d",&n,&k);
  80.  
  81.     nodes[0].parent=NULL;
  82.  
  83.     for(int i=0;i<n;++i)
  84.     {
  85.         nodes[i].deleted=false;
  86.         scanf("%I64d",&nodes[i].power);
  87.     }
  88.  
  89.     found[0]=true;
  90.  
  91.     for(int i=0;i<n-1;++i)
  92.     {
  93.         scanf("%d%d",&a,&b);
  94.         --a;
  95.         --b;
  96.         if(!found[a])
  97.         {
  98.             swap(a,b);
  99.         }
  100.         if(!found[a])
  101.         {
  102.             bruteforce[a].push_back(b);
  103.             bruteforce[b].push_back(a);
  104.         }
  105.         else
  106.         {
  107.             nodes[a].addChild(&nodes[b]);
  108.             nodes[b].setParent(&nodes[a]);
  109.             reconstruct(b);
  110.         }
  111.     }
  112.  
  113.     nodes[0].calculateSubtree();
  114.  
  115.     while(k--)
  116.     {
  117.         int smallest=-1;
  118.         for(int i=0;i<n;++i)
  119.         {
  120.             if(!nodes[i].deleted && (smallest==-1 || nodes[i].sum < nodes[smallest].sum))
  121.                 smallest=i;
  122.         }
  123.  
  124.         if(nodes[smallest].sum>0)
  125.             break;
  126.  
  127.         nodes[smallest].deleteIt();
  128.     }
  129.  
  130.     printf("%I64d",nodes[0].sum);
  131.  
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement