File size: 2,393 Bytes
1fd0050 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
std::vector<std::vector<int>> create_map(int N, int M,
std::vector<int> A, std::vector<int> B) {
if (N == 0) {
return {{1}};
}
std::vector<std::vector<bool>> adj(N + 1, std::vector<bool>(N + 1, false));
for (int i = 0; i < M; ++i) {
adj[A[i]][B[i]] = adj[B[i]][A[i]] = true;
}
std::vector<int> p(N);
std::iota(p.begin(), p.end(), 1);
std::vector<int> color(N + 1, 0);
int num_colors = 0;
for (int i = 1; i <= N; ++i) {
std::vector<bool> used_colors(N + 1, false);
for (int j = 1; j <= N; ++j) {
if (i != j && !adj[i][j] && color[j] != 0) {
used_colors[color[j]] = true;
}
}
int c = 1;
while (used_colors[c]) {
c++;
}
color[i] = c;
if (c > num_colors) {
num_colors = c;
}
}
std::vector<std::vector<int>> cliques(num_colors);
for (int i = 1; i <= N; ++i) {
cliques[color[i] - 1].push_back(i);
}
int K = 2 * num_colors;
if (K == 0) K = 1;
std::vector<std::vector<int>> res(K, std::vector<int>(K));
for (int i = 0; i < num_colors; ++i) {
int default_color = cliques[i].empty() ? 1 : cliques[i][0];
for (int j = 0; j < K; ++j) {
res[2 * i][j] = default_color;
res[2 * i + 1][j] = default_color;
}
}
int col_idx = 0;
// Condition 1: Ensure all countries appear
for (int i = 0; i < num_colors; ++i) {
for (int country : cliques[i]) {
res[2 * i][col_idx] = country;
res[2 * i + 1][col_idx] = country;
col_idx = (col_idx + 1) % K;
}
}
// Condition 2: Ensure all adjacencies are present
for (int i = 0; i < M; ++i) {
int u = A[i], v = B[i];
int u_c = color[u] - 1;
int v_c = color[v] - 1;
if (u_c == v_c) { // Intra-clique
res[2 * u_c][col_idx] = u;
res[2 * u_c + 1][col_idx] = v;
} else { // Inter-clique
int c1 = std::min(u_c, v_c);
int c2 = std::max(u_c, v_c);
res[2 * c1 + 1][col_idx] = (u_c < v_c) ? u : v;
res[2 * c2][col_idx] = (u_c < v_c) ? v : u;
}
col_idx = (col_idx + 1) % K;
}
return res;
} |