• Source
    1. #include<iostream>
    2. #include<vector>
    3. #include<cstring>
    4. using namespace std;
    5. int dp[1001][2]; // assuming maximum number of nodes is 1000, can change it
    6. vector< vector<int> >edges(1001);
    7. /* Initialize dp[][] to be -1 for all values (u,select) */
    8. /* Select is 0 or 1 for false/true respectively */
    9.  
    10. int func(int node , int select )
    11. {
    12. if(dp[node][select] != -1)return dp[node][select];
    13. int ans = 0,i;
    14.  
    15. // value of node is node number itself
    16. if(select)ans=node;
    17.  
    18. //edges[i] stores neighbors of node i
    19. for(i=0;i<(int)edges[node].size();i++)
    20. {
    21. if(select)ans=ans+func(edges[node][i],1-select);
    22. else ans=ans+max(func(edges[node][i],0),func(edges[node][i],1));
    23. }
    24. dp[node][select] = ans;
    25. return ans;
    26. }
    27.  
    28. // from main call, root is root of tree and answer is
    29. // your final answer
    30. int main()
    31. {
    32. memset(dp,-1,sizeof(dp));
    33. int noofedges,root,i,parent,child;
    34.  
    35. //input takes number of edges and root of the tree in your test case 1
    36. cin>> noofedges >> root;
    37. for(i = 0;i < noofedges ;i++)
    38. {
    39. //then each edge is given as parent child
    40. cin>> parent >> child;
    41. edges[parent].push_back(child);
    42. }
    43. int answer = max(func(root,0),func(root,1));
    44. cout<< answer <<endl;
    45.  
    46. // I have taken this kind of input format to make it easy you can change it, not much change will be there
    47. }
    48.  
    49.  
    50.