#include #include #include #include #include #include std::vector> create_map(int N, int M, std::vector A, std::vector B) { std::vector> adj(N + 1, std::vector(N + 1, false)); std::vector degree(N + 1, 0); for (int i = 0; i < M; ++i) { adj[A[i]][B[i]] = adj[B[i]][A[i]] = true; degree[A[i]]++; degree[B[i]]++; } std::vector p(N); std::iota(p.begin(), p.end(), 1); std::sort(p.begin(), p.end(), [&](int u, int v) { return degree[u] > degree[v]; }); std::vector c1(N + 1, 0), c2(N + 1, 0); int k_r = 0, k_c = 0; std::set> used_coords; for (int v_node : p) { int best_i = -1, best_j = -1; int min_new_max_k = 1e9; for (int d = 1; ; ++d) { for (int i = 1; i <= d; ++i) { int j = d; for (int iter = 0; iter < 2; ++iter) { if (i == j && iter == 1) continue; int cur_i = (iter == 0) ? i : j; int cur_j = (iter == 0) ? j : i; if (used_coords.count({cur_i, cur_j})) { continue; } bool ok = true; for (int u_node : p) { if (c1[u_node] == 0) continue; if ((adj[u_node][v_node] && (c1[u_node] != cur_i && c2[u_node] != cur_j)) || (!adj[u_node][v_node] && u_node != v_node && (c1[u_node] == cur_i || c2[u_node] == cur_j))) { ok = false; break; } } if (ok) { int new_max_k = std::max({k_r, k_c, cur_i, cur_j}); if (best_i == -1 || new_max_k < min_new_max_k) { min_new_max_k = new_max_k; best_i = cur_i; best_j = cur_j; } } } } if (best_i != -1) { break; } } c1[v_node] = best_i; c2[v_node] = best_j; used_coords.insert({best_i, best_j}); k_r = std::max(k_r, best_i); k_c = std::max(k_c, best_j); } if (N == 0) return {}; if (k_r == 0) k_r = 1; if (k_c == 0) k_c = 1; int K = std::max(k_r, k_c); std::vector> node_at(k_r + 1, std::vector(k_c + 1, 0)); for (int i = 1; i <= N; ++i) { node_at[c1[i]][c2[i]] = i; } for (int i = 1; i <= k_r; ++i) { for (int j = 1; j <= k_c; ++j) { if (node_at[i][j] == 0) { if (i > 1) { node_at[i][j] = node_at[i - 1][j]; } else if (j > 1) { node_at[i][j] = node_at[i][j - 1]; } } } } for (int i = 1; i <= k_r; ++i) { for (int j = 1; j <= k_c; ++j) { if (node_at[i][j] == 0) { if (j > 1) { node_at[i][j] = node_at[i][j - 1]; } else if (i > 1) { node_at[i][j] = node_at[i - 1][j]; } } } } if (node_at[1][1] == 0) { for (int i=1; i<=k_r; ++i) for (int j=1; j<=k_c; ++j) if(node_at[i][j] == 0) node_at[i][j] = p[0]; } std::vector> map(K, std::vector(K)); for (int r = 0; r < K; ++r) { for (int c = 0; c < K; ++c) { int i = (long long)r * k_r / K + 1; int j = (long long)c * k_c / K + 1; map[r][c] = node_at[i][j]; } } return map; }