#include #include #include #include struct disjoint_set { std::vector p, r; disjoint_set(unsigned n): p(n), r(n, 0) { for (unsigned i = 0; i < n; ++i) { p[i] = i; } } unsigned get(unsigned v) { return v == p[v] ? v : (p[v] = get(p[v])); } void unite(unsigned v1, unsigned v2) { v1 = get(v1); v2 = get(v2); if (v1 != v2) { if (r[v1] == r[v2]) ++r[v1]; if (r[v1] < r[v2]) { p[v1] = v2; } else { p[v2] = v1; } } } }; int main(int argc, char *argv[]) { if (argc != 6) { std::cerr << "Usage: " << argv[0] << " N D minD maxD seed" << std::endl; return 1; } unsigned n = atoi(argv[1]); unsigned d = atoi(argv[2]); int minD = atoi(argv[3]); int maxD = atoi(argv[4]); int seed = atoi(argv[5]) * n; std::mt19937 twister(seed); std::uniform_int_distribution vertex_index(1, n); std::uniform_int_distribution demand_value(minD, maxD); std::vector degree(n + 1, 0); disjoint_set ds(n + 1); std::cout << n << "\n"; for (unsigned i = 1; i < n; ++i) { int i1, i2; do { i1 = vertex_index(twister); i2 = vertex_index(twister); } while (degree[i1] == 3 || degree[i2] == 3 || ds.get(i1) == ds.get(i2)); ds.unite(i1, i2); ++degree[i1]; ++degree[i2]; std::cout << std::min(i1, i2) << " " << std::max(i1, i2) << "\n"; } std::cout << d << "\n"; for (unsigned i = 0; i < d; ++i) { int i1 = vertex_index(twister); int i2; do { i2 = vertex_index(twister); } while (i1 == i2); std::cout << std::min(i1, i2) << " " << std::max(i1, i2) << " " << demand_value(twister) << "\n"; } return 0; }