Dang_Quan_10_Tin

LAMPS

Aug 27th, 2020
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <cstring>
  5. #define task "LAMPS"
  6. using namespace std;
  7. using ll = long long;
  8. using ld = long double;
  9.  
  10. const int N = 4e2 + 2;
  11. int m, n, u, v, l, d;
  12. vector<pair<int, int>> s, adj[N];
  13. int ans[N * N / 4];
  14. using Pll = pair<int, int> *;
  15. Pll col[N][N];
  16.  
  17. void Read()
  18. {
  19.     cin >> m >> n;
  20.     l = m + n;
  21.     while (cin >> u >> v)
  22.     {
  23.         s.push_back({u, v + m});
  24.         adj[u].push_back({v + m, s.size() - 1});
  25.         adj[v + m].push_back({u, s.size() - 1});
  26.     }
  27. }
  28.  
  29. void Solve()
  30. {
  31.     for (int i = 1; i <= l; ++i)
  32.         d = max(d, (int)adj[i].size());
  33.     for (int i = 1; i <= l; ++i)
  34.         for (int j = 1; j <= d; ++j)
  35.             col[i][j] = NULL;
  36.     for (int i = 0; i < s.size(); ++i)
  37.     {
  38.         //cerr << i << "\n";
  39.         bool success = 0;
  40.         for (int j = 1; j <= d; ++j)
  41.             if (!col[s[i].first][j] && !col[s[i].second][j])
  42.             {
  43.                 success = 1;
  44.                 col[s[i].first][j] = new pair<int, int>;
  45.                 col[s[i].second][j] = new pair<int, int>;
  46.                 col[s[i].first][j]->first = s[i].second;
  47.                 col[s[i].second][j]->first = s[i].first;
  48.                 col[s[i].second][j]->second =
  49.                     col[s[i].first][j]->second = i;
  50.                 ans[i] = j;
  51.                 break;
  52.             }
  53.         if (success)
  54.             continue;
  55.         //cerr << "*\n";
  56.         int p[2] = {0, 0};
  57.         for (int j = 1; j <= d; ++j)
  58.         {
  59.             if (!col[s[i].first][j])
  60.                 p[0] = j;
  61.             if (!col[s[i].second][j])
  62.                 p[1] = j;
  63.             if (p[0] && p[1])
  64.                 break;
  65.         }
  66.         //cerr << p[0] << " " << p[1] << "\n";
  67.         //cerr << "#\n";
  68.         int now = s[i].first;
  69.         bool t = 1;
  70.         col[s[i].first][p[0]] = new pair<int, int>;
  71.         *col[s[i].first][p[0]] = {s[i].second, i};
  72.         col[s[i].second][p[1]] = new pair<int, int>;
  73.         *col[s[i].second][p[1]] = {s[i].first, i};
  74.         // cerr << "$\n";
  75.         do
  76.         {
  77.             int cur = col[now][p[t]]->first;
  78.             ans[col[now][p[t]]->second] = p[!t];
  79.             swap(col[now][p[t]], col[now][p[!t]]);
  80.             now = cur;
  81.             t = !t;
  82.         } while (col[now][p[t]]);
  83.         ans[i] = p[1];
  84.         swap(col[now][p[t]], col[now][p[!t]]);
  85.     }
  86.     cout << d << "\n";
  87.     for (int i = 0; i < s.size(); ++i)
  88.         cout << s[i].first << " " << s[i].second - m << " " << ans[i] << "\n";
  89. }
  90.  
  91. int32_t main()
  92. {
  93.     ios::sync_with_stdio(0);
  94.     cin.tie(0);
  95.     cout.tie(0);
  96.     if (fopen(task ".INP", "r"))
  97.         freopen(task ".INP", "r", stdin),
  98.             freopen(task ".OUT", "w", stdout);
  99.     Read();
  100.     Solve();
  101. }
Advertisement
Add Comment
Please, Sign In to add comment