Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <fstream>
  4. #include <algorithm>
  5. #include <limits.h>
  6. #include <iterator>
  7. #include <math.h>
  8. #include <cmath>
  9. #include <stdlib.h>
  10. #include <vector>
  11. #include <queue>
  12. #include <stack>
  13. #include <set>
  14. #include <random>
  15. #include <regex>
  16. #include <unordered_set>
  17. #include <string>
  18. #include <map>
  19. #include <iomanip>
  20. #include <sstream>
  21. #include <cassert>
  22. #include <time.h>
  23. #include <numeric>
  24. #include <complex>
  25.  
  26. using namespace std;
  27. using ull = unsigned long long;
  28. using ll = long long;
  29. using ld = long double;
  30. using D = double;
  31. using ii = pair<int, int>;
  32. using vi = vector<int>;
  33. using vii = vector<ii>;
  34.  
  35. #define pb push_back
  36. #define mp make_pair
  37. #define all(x) x.begin(),x.end()
  38. #define makeunique(x) sort(all(x)), (x).resize(unique(all(x)) - (x).begin())
  39. #define rep(i, x)  for(int i = 0; i < (x); i++)
  40. #define rrep(i, x) for(int i = (x - 1); i >= 0; i--)
  41. #define sqrt(x) sqrt(abs(x))
  42. #define y1 y1_1234413
  43. #define j1 j1_235
  44. #define y0 y0_235
  45. #define j0 j0_256
  46. #define fi first
  47. #define se second
  48. #define re return
  49. #define prev PREV
  50. #define next NEXT
  51. #define sz(x) ((int)x.size())
  52.  
  53. template<typename T> T sqr(T a) { re a * a; }
  54. template<typename T> T gcd(T a, T b) { re b ? gcd(b, a % b) : a; }
  55. template<typename T> T sgn(T a) { re a > 0 ? 1 : (a < 0 ? -1 : 0); }
  56. template<typename T> T abs(T a) { re a > 0 ? a : -a; }
  57.  
  58. const int inf = 2e9;
  59. const ld st = 0.000001;
  60. const ld pi = acos((ld)-1);
  61.  
  62. #define FILENAME ""
  63.  
  64. vector <int> parent;
  65. vector <int> rank1;
  66. vector <vector <int>> g;
  67.  
  68. void make_set(int v) {
  69.     parent[v] = v;
  70.     rank1[v] = 0;
  71. }
  72.  
  73. int find_set(int v) {
  74.     if (v == parent[v]) {
  75.         return v;
  76.     }
  77.     return parent[v] = find_set(parent[v]);
  78. }
  79.  
  80. void unions(int a, int b) {
  81.     a = find_set(a);
  82.     b = find_set(b);
  83.     if (a != b) {
  84.         if (rank1[b] > rank1[a]) {
  85.             swap(a, b);
  86.         }
  87.         parent[b] = a;
  88.         if (rank1[a] == rank1[b]) {
  89.             ++rank1[a];
  90.         }
  91.     }
  92. }
  93.  
  94. vector <int> randoms(int n, int k) {
  95.     vector <int> a;
  96.     for (int i = 0; i < n; i++) {
  97.         a.pb(i);
  98.     }
  99.     for (int i = 0; i < k; i++) {
  100.         next_permutation(all(a));
  101.     }
  102.     return a;
  103. }
  104.  
  105. void print(int n) {
  106.     for (int i = 0; i < n; i++) {
  107.         for (int j = 0; j < n; j++) {
  108.             cout << g[i][j] << " ";
  109.         }
  110.         cout << endl;
  111.     }
  112. }
  113.  
  114. int main()
  115. {
  116.     ios::sync_with_stdio(0);
  117.     cin.tie(NULL);
  118.     //freopen("input.txt", "r", stdin);
  119.     //freopen("output.txt", "w", stdout);
  120.     int n;
  121.     cin >> n;
  122.     std::random_device rd;
  123.     std::mt19937 gen(rd());
  124.     std::uniform_int_distribution<> dis(0, n - 1);
  125.     parent.resize(n);
  126.     rank1.resize(n);
  127.     g.resize(n);
  128.     for (int i = 0; i < n; i++) {
  129.         g[i].resize(n);
  130.     }
  131.     for (int i = 0; i < n; i++) {
  132.         make_set(i);
  133.     }
  134.     vector <int> r = randoms(n, 15);
  135.     vector <int> r2 = randoms(n, 19);
  136.     for (int i = 0; i < r.size(); i++) {
  137.         int k = dis(gen);
  138.         int a = find_set(r[i]);
  139.         int b = find_set(r2[k]);
  140.         if (a != b) {
  141.             g[r[i]][r2[k]] = 1;
  142.             g[r2[k]][r[i]] = 1;
  143.             unions(r[i], r2[k]);
  144.         }
  145.         else {
  146.             set <int> temp;
  147.             for (int i = 0; i < n; i++) {
  148.                 temp.insert(find_set(i));
  149.             }
  150.             if (temp.size() > 1) {
  151.                 i--;
  152.             }
  153.         }
  154.     }
  155.     int k = (n*(n - 1))/4 - (n - 1);
  156.     if (k <= 0) {
  157.         print(n);
  158.         re 0;
  159.     }
  160.     for (int i = 0; i < n; i++) {
  161.         int k = dis(gen);
  162.         if (r[i] == r2[k]) {
  163.             i--;
  164.         }
  165.         else {
  166.             if (g[r[i]][r2[k]] == 0) {
  167.                 g[r[i]][r2[k]] = 1;
  168.                 g[r2[k]][r[i]] = 1;
  169.                 --k;
  170.                 if (k == 0) {
  171.                     print(n);
  172.                     re 0;  
  173.                 }
  174.             }
  175.             else {
  176.                 i--;
  177.             }
  178.         }
  179.     }
  180.     print(n);
  181.     return 0;
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement