Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. //#pragma comment(linker, "/stack:200000000")
  5. using namespace std;
  6.  
  7. void min_cov_paths(int root, int parent, int *dp0, int *dp1, vector<int> *neigh){
  8.     if(neigh[root].size() == 1 && parent!=0){
  9.         dp0[root] = 1;
  10.         dp1[root] = 1;
  11.     }
  12.     else{
  13.         int sum = 0; //suma po dp[syn][1]
  14.         int min_son1_diff = 1000000;
  15.         int min_son2_diff = 1000000;
  16.  
  17.         for(int i=0; i<neigh[root].size(); i++){
  18.             int v = neigh[root][i];
  19.             if(v != parent){
  20.                 //min_cov_paths(v, root);
  21.                 sum += dp1[v];
  22.                 int diff = dp0[v]-dp1[v];
  23.                 if(diff < min_son1_diff){
  24.                     min_son1_diff = diff;
  25.                 }
  26.                 else{
  27.                     if(diff < min_son2_diff){
  28.                         min_son2_diff = diff;
  29.                     }
  30.                 }
  31.             }
  32.         }
  33.         int w1 = sum + 1;
  34.         int w2 = sum + min_son1_diff;
  35.         int w3 = sum + min_son1_diff + min_son2_diff - 1;
  36.         dp0[root] = min(w1, w2);
  37.         dp1[root] = min(dp0[root], w3);
  38.     }
  39. }
  40.  
  41. int main(){
  42.     int n;
  43.     cin >> n;
  44.  
  45.     vector<int> neigh[n+1];
  46.  
  47.     for (int i=0; i<n-1; i++){
  48.         int a, b;
  49.         cin >> a >> b;
  50.         neigh[a].push_back(b);
  51.         neigh[b].push_back(a);
  52.     }
  53.     int root = 1;
  54.     int dp0[n+1]; //dp0[i]<-najmniejsza liczba œcie¿ek w poddrzewie wierzcho³ja i, taka ¿e jedna ze œcie¿ek koñczy siê w i
  55.     int dp1[n+1]; //dp1[i]<-najmniejsza liczba œcie¿ek w poddrzewie wierzcho³ka i
  56.  
  57.     vector< pair<int, int> > order;
  58.     queue< pair<int, int> > q; // pair.first = vertex, pair.second = parent
  59.     q.push(make_pair(1,0));
  60.     while(!q.empty()){
  61.         pair<int, int> p = q.front();
  62.         order.push_back(p);
  63.         q.pop();
  64.         //cout << p.first << " "<< p.second << endl;
  65.         for(int i=0; i<neigh[p.first].size(); i++){
  66.             if(neigh[p.first][i] != p.second){
  67.                 q.push(make_pair(neigh[p.first][i], p.first));
  68.             }
  69.         }
  70.     }
  71.  
  72.     for(int i=n-1; i>=0; i--){
  73.         min_cov_paths(order[i].first, order[i].second, dp0, dp1, neigh);
  74.     }
  75.  
  76.     cout << dp1[root];
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement