#include #include #include using namespace std; int main(int argc, char* argv[]) { int n = atoi(argv[1]); int m = atoi(argv[2]); int max_len = atoi(argv[3]); int seed = atoi(argv[4]); std::mt19937 rng(seed); std::uniform_int_distribution lengths(2, max_len); vector > edges; while (true) { vector p; for (int i = 0; i < n; ++i) { p.push_back(i); } std::shuffle(p.begin(), p.end(), rng); int cycle_len = lengths(rng); if (edges.size() + cycle_len > m) { break; } for (int i = 0; i < cycle_len - 1; ++i) { edges.push_back(make_pair(p[i], p[i + 1])); } edges.push_back(make_pair(p[cycle_len - 1], p[0])); } // shuffle vertices vector v; for (int i = 0; i < n; ++i) { v.push_back(i); } std::shuffle(v.begin(), v.end(), rng); for (pair& e : edges) { e.first = v[e.first - 1] + 1; e.second = v[e.second - 1] + 1; } // shuffle edges std::shuffle(edges.begin(), edges.end(), rng); cout << n << " " << edges.size() << "\n"; for (const pair e : edges) { cout << e.first << " " << e.second << "\n"; } return 0; }