Tanisha25

Untitled

Oct 10th, 2022
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.17 KB | Source Code | 0 0
  1. //Tanisha Pareek.
  2. // a=97, z=122, A=65, Z=90, '0'-48, '9'-57
  3.  
  4. #include <bits/stdc++.h>
  5. #include<ext/pb_ds/assoc_container.hpp>
  6. #include<ext/pb_ds/tree_policy.hpp>
  7.  
  8. using namespace __gnu_pbds;
  9. using namespace std;
  10.  
  11. #define pb push_back
  12.  
  13. typedef long long ll;
  14. typedef vector<ll> vll;
  15. typedef tree<ll, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> pbds; // find_by_order(k)--(returns iterator of ele. at index k), order_of_key(k)--(returns index of k if k was present in set.)
  16. typedef tree<ll, null_type, less_equal<int>, rb_tree_tag,tree_order_statistics_node_update> multipbds;
  17.  
  18. //--CONSTANTS--
  19. const ll mod = 1e9 + 7;
  20.  
  21. //--USEFUL FUNCTIONS--
  22. bool    isPalindrome(string str){ll low = 0,high = str.length() - 1;while (low < high){if (str[low] != str[high])return false;low++,high--;}return true;}
  23. bool    isPrime(ll n){for(ll i=2;(i*i)<=n;i++){if((n%i) == 0) return false;}return true;}
  24. ll      highestSmallerPower(ll num, ll p){ll cnt=0,curr=1;while((curr*p)<=num) curr*=p,cnt++;return cnt;} // gives largest power value(say x) such that p^x <= num
  25. ll      binpow(ll num, ll p){ll ans=1;while(p>0){if(p&1) ans = ans*num;num = num*num;p/=2;}return ans;} // num^p
  26. ll      modulerExpo(ll num,ll p,ll m){ll ans=1;num%=m;while(p){if(p&1) ans*=num;ans%=m;p = p>>1;num*=num;num%=m;}return ans;} // (num^p)%m
  27. ll      phin(ll n){ll result = n;for(ll i=2;(i*i)<=n;i++){if(n%i == 0){while(n%i == 0) n/=i;result -= result/i;}}if(n>1) result -= (result/n);return result;}
  28.  
  29. // To find if two elements are from same component, just check their parent using dsu.
  30. // To find no. of connected components, run a loop on all elements and find their parents. Maintain count of unique parents, that's the answer
  31. // Loop exists when two elements are already in the same component and you are performing their union.
  32. struct DSU {
  33.     vll parent,sizz;
  34.     DSU() {}
  35.     DSU(ll n) {
  36.         for(ll i=0;i<=n;i++) parent.push_back(i);
  37.         sizz.assign(n+1,1);
  38.     }
  39.  
  40.     ll find_set(ll v) {
  41.         if(parent[v] == v) return v;
  42.         return parent[v] = find_set(parent[v]);
  43.     }
  44.  
  45.     void union_set(ll u,ll v) {
  46.         u = find_set(u);
  47.         v = find_set(v);
  48.  
  49.         if(v == u) return;
  50.  
  51.         if(sizz[u] > sizz[v]) swap(u,v);
  52.         parent[u] = v;
  53.         sizz[v] += sizz[u];
  54.     }
  55. };
  56.  
  57. // ---- Solution ----
  58.  
  59. ll cal(vll &childs, map<ll,vll> &tree, vll &visited, ll root)
  60. {
  61.     visited[root]=1;
  62.     for(auto i:tree[root])
  63.     {
  64.         if(visited[i] == 1) continue;
  65.         childs[root] += (1+cal(childs,tree,visited,i));
  66.     }
  67.     return childs[root];
  68. }
  69.  
  70. int main()
  71. {
  72.     #ifndef ONLINE_JUDGE
  73.     freopen("input.txt", "r", stdin);
  74.     freopen("output.txt", "w", stdout);
  75.     #endif
  76.  
  77.     ios_base::sync_with_stdio(false);
  78.     cin.tie(0);
  79.     cout.tie(0);
  80.  
  81.     ll t;
  82.     cin>>t;
  83.     while(t--)
  84.     {
  85.         ll n;
  86.         cin>>n;
  87.         map<ll,vll> tree;
  88.         ll ui,vi;
  89.         for(ll i=0;i<(n-1);i++)
  90.         {
  91.             cin>>ui>>vi;
  92.             // if(ui>vi) swap(ui,vi);
  93.             tree[ui].pb(vi);
  94.             tree[vi].pb(ui);
  95.         }
  96.  
  97.         vll childs((n+1),0);
  98.         vll visited((n+1),0);
  99.         visited[0]=1;
  100.         cal(childs,tree,visited,1);
  101.  
  102.         // for(auto i:tree)
  103.         // {
  104.         //     cout<<"i:"<<i.first<<": ";
  105.         //     for(auto x:i.second) cout<<x<<" ";
  106.         //     cout<<"\n";
  107.         // }
  108.         // for(ll i=1;i<=n;i++) cout<<"i:"<<i<<" -> "<<childs[i]<<"\n";
  109.  
  110.         ll ans=0;
  111.         ll root = 1,par=-1;
  112.         while(1)
  113.         {
  114.             if(tree[root].size() == 1)
  115.             {
  116.                 if(childs[root] == 0) break;
  117.                 ans += (childs[root]-1);
  118.                 break;
  119.             }
  120.             else if(tree[root].size()==2)
  121.             {
  122.                 ll val1 = tree[root][0];
  123.                 ll val2 = tree[root][1];
  124.  
  125.                 if(val1 == par)
  126.                 {
  127.                     ans += childs[val2];
  128.                     break;
  129.                 }
  130.                 else if(val2 == par)
  131.                 {
  132.                     ans += childs[val1];
  133.                     break;
  134.                 }
  135.                 else
  136.                 {
  137.                     par=root;
  138.                     if(childs[val1] > childs[val2])
  139.                     {
  140.                         ans += childs[val1];
  141.                         root = val2;
  142.                     }
  143.                     else
  144.                     {
  145.                         ans += childs[val2];
  146.                         root = val1;
  147.                     }
  148.                 }
  149.             }
  150.             else
  151.             {
  152.                 ll val1 = tree[root][0];
  153.                 ll val2 = tree[root][1];
  154.  
  155.                 if(val1 == par) val1 = tree[root][2];
  156.                 else if(val2 == par) val2 = tree[root][2];
  157.  
  158.                 par=root;
  159.                 if(childs[val1] > childs[val2])
  160.                 {
  161.                     ans += childs[val1];
  162.                     root = val2;
  163.                 }
  164.                 else
  165.                 {
  166.                     ans += childs[val2];
  167.                     root = val1;
  168.                 }
  169.             }
  170.         }
  171.         cout<<ans<<"\n";
  172.     }
  173.     return 0;
  174. }
Add Comment
Please, Sign In to add comment