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;
}