Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <fstream>
- #include <algorithm>
- #include <limits.h>
- #include <iterator>
- #include <math.h>
- #include <cmath>
- #include <stdlib.h>
- #include <vector>
- #include <queue>
- #include <stack>
- #include <set>
- #include <random>
- #include <regex>
- #include <unordered_set>
- #include <string>
- #include <map>
- #include <iomanip>
- #include <sstream>
- #include <cassert>
- #include <time.h>
- #include <numeric>
- #include <complex>
- using namespace std;
- using ull = unsigned long long;
- using ll = long long;
- using ld = long double;
- using D = double;
- using ii = pair<int, int>;
- using vi = vector<int>;
- using vii = vector<ii>;
- #define pb push_back
- #define mp make_pair
- #define all(x) x.begin(),x.end()
- #define makeunique(x) sort(all(x)), (x).resize(unique(all(x)) - (x).begin())
- #define rep(i, x) for(int i = 0; i < (x); i++)
- #define rrep(i, x) for(int i = (x - 1); i >= 0; i--)
- #define sqrt(x) sqrt(abs(x))
- #define y1 y1_1234413
- #define j1 j1_235
- #define y0 y0_235
- #define j0 j0_256
- #define fi first
- #define se second
- #define re return
- #define prev PREV
- #define next NEXT
- #define sz(x) ((int)x.size())
- template<typename T> T sqr(T a) { re a * a; }
- template<typename T> T gcd(T a, T b) { re b ? gcd(b, a % b) : a; }
- template<typename T> T sgn(T a) { re a > 0 ? 1 : (a < 0 ? -1 : 0); }
- template<typename T> T abs(T a) { re a > 0 ? a : -a; }
- const int inf = 2e9;
- const ld st = 0.000001;
- const ld pi = acos((ld)-1);
- #define FILENAME ""
- vector <int> parent;
- vector <int> rank1;
- vector <vector <int>> g;
- void make_set(int v) {
- parent[v] = v;
- rank1[v] = 0;
- }
- int find_set(int v) {
- if (v == parent[v]) {
- return v;
- }
- return parent[v] = find_set(parent[v]);
- }
- void unions(int a, int b) {
- a = find_set(a);
- b = find_set(b);
- if (a != b) {
- if (rank1[b] > rank1[a]) {
- swap(a, b);
- }
- parent[b] = a;
- if (rank1[a] == rank1[b]) {
- ++rank1[a];
- }
- }
- }
- vector <int> randoms(int n, int k) {
- vector <int> a;
- for (int i = 0; i < n; i++) {
- a.pb(i);
- }
- for (int i = 0; i < k; i++) {
- next_permutation(all(a));
- }
- return a;
- }
- void print(int n) {
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- cout << g[i][j] << " ";
- }
- cout << endl;
- }
- }
- int main()
- {
- ios::sync_with_stdio(0);
- cin.tie(NULL);
- //freopen("input.txt", "r", stdin);
- //freopen("output.txt", "w", stdout);
- int n;
- cin >> n;
- std::random_device rd;
- std::mt19937 gen(rd());
- std::uniform_int_distribution<> dis(0, n - 1);
- parent.resize(n);
- rank1.resize(n);
- g.resize(n);
- for (int i = 0; i < n; i++) {
- g[i].resize(n);
- }
- for (int i = 0; i < n; i++) {
- make_set(i);
- }
- vector <int> r = randoms(n, 15);
- vector <int> r2 = randoms(n, 19);
- for (int i = 0; i < r.size(); i++) {
- int k = dis(gen);
- int a = find_set(r[i]);
- int b = find_set(r2[k]);
- if (a != b) {
- g[r[i]][r2[k]] = 1;
- g[r2[k]][r[i]] = 1;
- unions(r[i], r2[k]);
- }
- else {
- set <int> temp;
- for (int i = 0; i < n; i++) {
- temp.insert(find_set(i));
- }
- if (temp.size() > 1) {
- i--;
- }
- }
- }
- int k = (n*(n - 1))/4 - (n - 1);
- if (k <= 0) {
- print(n);
- re 0;
- }
- for (int i = 0; i < n; i++) {
- int k = dis(gen);
- if (r[i] == r2[k]) {
- i--;
- }
- else {
- if (g[r[i]][r2[k]] == 0) {
- g[r[i]][r2[k]] = 1;
- g[r2[k]][r[i]] = 1;
- --k;
- if (k == 0) {
- print(n);
- re 0;
- }
- }
- else {
- i--;
- }
- }
- }
- print(n);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement