#include "worldmap.h"
#include <functional>
std::vector<std::vector<int>> create_map(int N, int M, std::vector<int> A, std::vector<int> B) {
std::vector<std::vector<int>> ans(2 * N, std::vector<int>(2 * N, 1));
for (auto& x : A) --x; for (auto& x : B) --x;
std::vector<std::vector<int>> adj(N, std::vector<int>());
for (int i = 0; i < M; i++) adj[A[i]].push_back(B[i]), adj[B[i]].push_back(A[i]);
std::vector<int> euler_tour;
if (M == N - 1) {
bool sub1 = true;
for (int i = 0; i + 1 < N; i++) if (A[i] != i || B[i] != i + 1) sub1 = false;
if (sub1) {
for (int i = 0; i < 2 * N; i++) for (int j = 0; j < 2 * N; j++) ans[i][j] = N;
for (int i = 1; i < N; i++) for (int j = 0; j < 2 * N; j++) ans[i - 1][j] = i;
} else {
for (int i = 0; i < 2 * N; i++) for (int j = 0; j < 2 * N; j++) ans[i][j] = 1;
std::function<void(int, int)> DFS;
DFS = [&](int u, int par) {
euler_tour.push_back(u + 1);
for (int v : adj[u]) {
if (v ^ par) {
DFS(v, u);
euler_tour.push_back(u + 1);
}
}
};
DFS(0, 0);
for (int i = 0; i < (int) euler_tour.size(); i++) for (int j = 0; j < 2 * N; j++) ans[i][j] = euler_tour[i];
}
return ans;
}
if (M == N * (N - 1) / 2) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < 2 * N; j++) {
ans[i * 2][j] = i + 1;
ans[i * 2 + 1][j] = (j + 1 <= N ? j + 1 : N);
}
}
return ans;
}
bool sub4 = true;
std::vector<bool> ok(N, false);
for (int i = 0; i < M; i++) if (A[i] == 0 || B[i] == 0) ok[A[i] + B[i]] = true;
for (int i = 1; i < N; i++) if (!ok[i]) sub4 = false;
if (sub4) {
for (int i = 0; i < 2 * N; i++) for (int j = 0; j < 2 * N; j++) ans[i][j] = 1;
for (int i = 0; i < N; i++) {
int row = i * 2;
for (int j = 0; j < 2 * N; j++) ans[row][j] = i + 1;
for (int j = 0; j < (int) adj[i].size(); j++) ans[row][j * 2] = adj[i][j] + 1;
}
return ans;
}
std::vector<bool> visited(N, false);
std::function<void(int)> DFS;
DFS = [&](int u) {
visited[u] = true;
euler_tour.push_back(u + 1);
for (int v : adj[u]) {
if (!visited[v]) {
DFS(v);
euler_tour.push_back(u + 1);
}
}
};
DFS(0);
ans.assign(4 * N, std::vector<int>(4 * N, 1));
int row = 0;
visited.assign(N, false);
for (int i = 0; i < (int) euler_tour.size(); i++) {
int u = euler_tour[i];
if (visited[u - 1]) {
for (int j = 0; j < 4 * N; j++) ans[row][j] = u;
++row;
continue;
}
for (int j = 0; j < 4 * N; j++) ans[row][j] = ans[row + 1][j] = ans[row + 2][j] = u;
for (int j = 0; j < (int) adj[u - 1].size(); j++) ans[row + 1][j * 2] = adj[u - 1][j] + 1;
row += 3;
visited[u - 1] = true;
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |