Saturday, January 26, 2019

[toph.co] Sofdor Ali's Black and White Tree

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : Sofdor Ali's Black and White Tree
Source            : toph.co
Category          : Graph Theory, Dynamic Programing
Algorithm         : DP on Tree
Verdict           : Accepted

  1. #include <bits/stdc++.h>  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 1e5 + 5;  
  6.   
  7. vector <int> graph[maxn];  
  8. int color[maxn], white[maxn], black[maxn];  
  9. int maxDiff = 0, maxWhite = -1, maxNode = -1;  
  10.   
  11. inline void dfs(int u = 0, int p = -1)  
  12. {  
  13.       if (color[u] == 0) black[u]++; // BLACK  
  14.       else white[u]++;               // WHITE  
  15.       for (int v : graph[u])  
  16.       {  
  17.             if (v == p) continue;  
  18.             dfs(v, u);  
  19.             white[u] += white[v];  
  20.             black[u] += black[v];  
  21.       }  
  22.       int diff = black[u] - white[u];  
  23.       if (diff < 0)  
  24.       {  
  25.   
  26.       }  
  27.       else  
  28.       {  
  29.             if (diff > maxDiff)  
  30.             {  
  31.                   maxNode = u;  
  32.                   maxDiff = diff;  
  33.                   maxWhite = white[u];  
  34.             }  
  35.             else if (diff == maxDiff)  
  36.             {  
  37.                   if (maxWhite > white[u])  
  38.                   {  
  39.                         maxNode = u;  
  40.                         maxWhite = white[u];  
  41.                   }  
  42.             }  
  43.       }  
  44. }  
  45.   
  46. int twhite = 0;  
  47.   
  48. inline void dfs2(int u = 0, int p = -1)  
  49. {  
  50.       if (u == maxNode)  
  51.       {  
  52.             twhite += black[u];  
  53.             return;  
  54.       }  
  55.       else if (color[u] == 1)  
  56.       {  
  57.             twhite += 1;  
  58.       }  
  59.       for (int v : graph[u])  
  60.       {  
  61.             if (v == p) continue;  
  62.             dfs2(v, u);  
  63.       }  
  64. }  
  65.   
  66. int main()  
  67. {  
  68.       //freopen("in.txt", "r", stdin);  
  69.   
  70.       ios_base::sync_with_stdio(false);  
  71.       cin.tie(NULL);  
  72.   
  73.       int tnode;  
  74.       cin >> tnode;  
  75.       for (int i = 0; i < tnode; i++) cin >> color[i];  
  76.       for (int i = 1; i < tnode; i++)  
  77.       {  
  78.             int u, v;  
  79.             cin >> u >> v;  
  80.             graph[u].push_back(v);  
  81.             graph[v].push_back(u);  
  82.       }  
  83.       dfs();  
  84.       dfs2();  
  85.       cout << twhite << endl;  
  86. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.