joylintp

bruh

Dec 14th, 2021
508
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. //{
  5. //#pragma gcc optimize("Ofast,unroll-loops")
  6. //#pragma gcc target("sse,sse2,sse3,ssse3,sse4,avx,avx2,fma,abm,mmx,popcnt,tune=native")
  7. //#define int long long
  8. //#define double long double
  9. #define MP make_pair
  10. #define F first
  11. #define S second
  12. #define MOD 1000000007
  13. #define INF 1000000000
  14. //}
  15.  
  16. int mp;
  17. vector<bool> vis;
  18. vector<int> ord, scc, med;
  19. vector<vector<int>> G, Gt, H;
  20.  
  21. void dfs1(int u)
  22. {
  23.     vis[u] = true;
  24.     for (int i : G[u])
  25.         if (!vis[i])
  26.             dfs1(i);
  27.     ord.push_back(u);
  28. }
  29.  
  30. void dfs2(int u, int id)
  31. {
  32.     scc[u] = id;
  33.     for (int i : Gt[u])
  34.         if (!scc[i])
  35.             dfs2(i, id);
  36. }
  37.  
  38. void dfs3(int u)
  39. {
  40.     vis[u] = true;
  41.     for (int i : H[u])
  42.         if (!vis[i])
  43.             dfs3(i);
  44.  
  45.     if (H[u].empty())
  46.         mp = u;
  47. }
  48.  
  49. signed main()
  50. {
  51.     ios_base::sync_with_stdio(false);
  52.     cin.tie(0);
  53.  
  54.     int T, flag;
  55.     cin >> T >> flag;
  56.     while (T--)
  57.     {
  58.         vis.clear(), ord.clear(), scc.clear(), G.clear(), Gt.clear(), H.clear();
  59.  
  60.         int N, M;
  61.         cin >> N >> M;
  62.  
  63.         G.resize(N + 1), Gt.resize(N + 1);
  64.         while (M--)
  65.         {
  66.             int u, v;
  67.             cin >> u >> v;
  68.             G[u].push_back(v), Gt[v].push_back(u);
  69.         }
  70.  
  71.         vis.resize(N + 1);
  72.         for (int i = 1; i <= N; i++)
  73.             if (!vis[i])
  74.                 dfs1(i);
  75.  
  76.         int csc = 1;
  77.         reverse(ord.begin(), ord.end()), scc.resize(N + 1);
  78.         vector<int> sch = {-1};
  79.         for (int i : ord)
  80.             if (!scc[i])
  81.                 sch.push_back(i), dfs2(i, csc), csc++;
  82.         csc--;
  83.  
  84.         H.resize(csc + 1);
  85.         vector<int> id(csc + 1), od(csc + 1);
  86.         for (int i = 1; i <= N; i++)
  87.             for (int j : G[i])
  88.                 if (scc[i] != scc[j])
  89.                     H[scc[i]].push_back(scc[j]), od[scc[i]]++, id[scc[j]]++;
  90.  
  91.         if (csc == 1)
  92.             cout << "0\n";
  93.         else
  94.         {
  95.             int ca = 0, cb = 0;
  96.             for (int i = 1; i <= csc; i++)
  97.                 ca += !id[i], cb += !od[i];
  98.             cout << max(ca, cb) << '\n';
  99.  
  100.             if (flag)
  101.             {
  102.                 vector<pair<int, int>> ans;
  103.                 for (int i = 1; i <= csc; i++)
  104.                     vis[i] = false;
  105.                 med.clear();
  106.                 for (int i = 1; i <= csc; i++)
  107.                     if (!vis[i])
  108.                     {
  109.                         mp = 0, dfs3(i);
  110.                         if (mp)
  111.                             med.push_back(i), med.push_back(mp);
  112.                     }
  113.  
  114.                 for (int i = 1; i < (int)med.size(); i += 2)
  115.                 {
  116.                     int a = med[i], b = med[(i + 1) % med.size()];
  117.                     ans.push_back(MP(a, b)), id[b]++, od[a]++;
  118.                 }
  119.  
  120.                 int gd = -1;
  121.                 list<int> ie, oe;
  122.                 for (int i = 1; i <= csc; i++)
  123.                     if (!id[i])
  124.                         ie.push_back(i);
  125.                     else if (!od[i])
  126.                         oe.push_back(i);
  127.                     else
  128.                         gd = i;
  129.  
  130.                 while (!ie.empty() && !oe.empty())
  131.                 {
  132.                     int a = ie.front(), b = oe.front();
  133.                     ie.pop_front(), oe.pop_front(), ans.push_back(MP(b, a)), gd = a;
  134.                 }
  135.  
  136.                 while (!ie.empty())
  137.                     ans.push_back(MP(gd, ie.front())), ie.pop_front();
  138.                 while (!oe.empty())
  139.                     ans.push_back(MP(oe.front(), gd)), oe.pop_front();
  140.  
  141.                 assert(ans.size() == max(ca, cb));
  142.                 for (auto p : ans)
  143.                     cout << sch[p.F] << ' ' << sch[p.S] << '\n';
  144.             }
  145.         }
  146.     }
  147.  
  148.     return 0;
  149. }
  150.  
  151. //      *****  *****  *   *  *      *****  *   *  *****  *****
  152. //        *   *   *  *   *  *        *    **  *    *    *   *
  153. //       *   *   *  *****  *        *    * * *    *    *****
  154. //   *  *   *   *    *    *        *    *  **    *    *
  155. //  ****   *****    *    *****  *****  *   *    *    *
  156.  
  157. //     *   *   ***   *   *  **
  158. //    *   *  *   *  *   *  **
  159. //   * * *  *****  *****  **
  160. //  * * *  *   *  *   *
  161. //  * *   *   *  *   *  **
  162.  
Advertisement
Add Comment
Please, Sign In to add comment