Advertisement
ThegeekKnight16

Small Graph

Sep 21st, 2024
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 1e3 + 10;
  4. vector<int> grafo[30*MAXN];
  5.  
  6. int main()
  7. {
  8.     ios_base::sync_with_stdio(false);
  9.     cin.tie(NULL);
  10.     freopen("small-graph.in", "r", stdin);
  11.     freopen("small-graph.out", "w", stdout);
  12.     int N;
  13.     cin >> N;
  14.     vector<int> p(N+1);
  15.     for (int i = 1; i <= N; i++) cin >> p[i];
  16.     int arestas = 0;
  17.     map<vector<int>, vector<int>> Marc;
  18.     for (int i = 1; i <= N; i++)
  19.     {
  20.         int MaxP = -1;
  21.         for (int j = i+1; j <= N; j++)
  22.         {
  23.             if (p[j] > p[i]) continue;
  24.             if (MaxP > p[j]) continue;
  25.             MaxP = p[j];
  26.             arestas++;
  27.             grafo[i].push_back(j);
  28.         }
  29.         sort(grafo[i].begin(), grafo[i].end());
  30.         if (!grafo[i].empty()) Marc[grafo[i]].push_back(i);
  31.     }
  32.     int verti = N;
  33.  
  34.     for (auto [objs, ids] : Marc)
  35.     {
  36.         if (ids.size() == 1 || objs.size() == 1) continue;
  37.         ++verti;
  38.         for (auto i : ids)
  39.         {
  40.             arestas -= grafo[i].size();
  41.             grafo[i].clear();
  42.             arestas++;
  43.             grafo[i].push_back(verti);
  44.         }
  45.         arestas += objs.size();
  46.         grafo[verti] = objs;
  47.     }
  48.  
  49.     assert(arestas <= 6*N);
  50.     cout << verti << " " << arestas << '\n';
  51.     for (int i = 1; i <= verti; i++) for (auto viz : grafo[i]) cout << i << " " << viz << '\n';
  52. }
  53.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement