Advertisement
silentkiler029

Graph Marathon - May 2021 - Problem ::: F

May 30th, 2021
856
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.49 KB | None | 0 0
  1. /*
  2.             BISMILLAHIR-RAHMANIR-RAHIM
  3.                     SWExSh4n.t0
  4.                         SUST
  5. */
  6. #include <bits/stdc++.h>
  7. using namespace std;
  8.  
  9. std::priority_queue < std::pair < int , int > > pq;
  10. std::vector < std::vector < int > > G;
  11. std::vector < std::vector < int > > H;
  12. std::vector < bool > vis;
  13. std::vector < bool > vis2;
  14. std::vector < int > koyjon_ke_dey;
  15. std::set < int > set1;  //   true-in true-out
  16. std::set < int > set2;  //  false-in true-out
  17.  
  18. int bfs ( int src, int n )
  19. {
  20.     vis2.clear();
  21.     vis2.resize(n);
  22.     std::queue < int > q;
  23.     q.push(src);
  24.     vis2[src] = true;
  25.  
  26.     int u, cnt = 1;
  27.  
  28.     while( !q.empty() )
  29.     {
  30.         u = q.front(); q.pop();
  31.         for( auto v : G[u] )
  32.         {
  33.             if( !vis2[v] )
  34.             {
  35.                 vis2[v] = true;
  36.                 q.push(v);
  37.                 cnt++;
  38.             }
  39.         }
  40.     }
  41.  
  42.     return cnt;
  43. }
  44.  
  45. void khela_hobe( int src, int n )
  46. {
  47.     std::queue < int > q;
  48.     q.push(src);
  49.     vis[src] = true;
  50.     koyjon_ke_dey[src] = 0;
  51.     set1.clear();
  52.     set2.clear();
  53.  
  54.     int u, v, mx , mn, mxIndx, mnIndx;
  55.  
  56.     mx = mn = koyjon_ke_dey[src];
  57.     mxIndx = mnIndx = src;
  58.  
  59.     //  just find out the sub-graph
  60.     while( !q.empty() )
  61.     {
  62.         u = q.front(); q.pop();
  63.         if( H[u].size() ) {
  64.             set1.insert(u);
  65.         }
  66.         else {
  67.             set2.insert(u);
  68.         }
  69.         for( int i = 0; i < G[u].size(); i++ ) {
  70.             v = G[u][i];
  71.             if( !vis[v] )
  72.             {
  73.                 vis[v] = true;
  74.                 q.push(v);
  75.             }
  76.         }
  77.         for( int i = 0; i < H[u].size(); i++ )
  78.         {
  79.             v = H[u][i];
  80.             if( !vis[v] )
  81.             {
  82.                 vis[v] = true;
  83.                 q.push(v);
  84.             }
  85.         }
  86.     }
  87.  
  88.     // find out the best leader in the sub-graph
  89.     std::pair < int , int > p_air;
  90.     if( set2.size() == 0 )
  91.     {
  92.         p_air.first = set1.size();
  93.         p_air.second = n;
  94.         for( auto x : set1 )
  95.         {
  96.             if( x < p_air.second ) p_air.second = x;
  97.         }
  98.         p_air.second *= -1;
  99.         pq.push(p_air);
  100.     }
  101.     else {
  102.         for( auto srcc : set2 )
  103.         {
  104.             p_air.first = bfs( srcc, n );
  105.             p_air.second = -srcc;
  106.             pq.push(p_air);
  107.         }
  108.     }
  109. }
  110.  
  111. void init ( int n )
  112. {
  113.     G.clear();
  114.     G.resize(n);
  115.     H.clear();
  116.     H.resize(n);
  117.     vis.clear();
  118.     vis.resize(n);
  119.     koyjon_ke_dey.clear();
  120.     koyjon_ke_dey.resize(n);
  121.  
  122.     while ( !pq.empty() )
  123.         pq.pop();
  124. }
  125.  
  126. int main()
  127. {
  128.     int t, cs = 0;
  129.     std::cin >> t;
  130.     int n, u, v;
  131.  
  132.     while( t-- ) {
  133.         std::cin >> n;
  134.         init(n);
  135.         for( int i = 0; i < n; i++ ) {
  136.             std::cin >> u >> v;
  137.             u--, v--;
  138.             G[u].push_back(v);
  139.             H[v].push_back(u);
  140.         }
  141.  
  142.         for( int i = n-1; i >= 0; i-- ) {
  143.             if( !vis[i] ) {
  144.                 khela_hobe( i, n );
  145.             }
  146.         }
  147.  
  148.         std::cout << "Case " << ++cs << ": " << -pq.top().second + 1 << endl;
  149.     }
  150.     return 0;
  151. }
  152.  
  153. //  ALHAMDULILLAH
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement