| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1287219 | ecen30 | 세계 지도 (IOI25_worldmap) | C++20 | 0 ms | 0 KiB |
//testing AI code
#include "worldmap.h"
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> create_map(int N, int M, vector<int> A, vector<int> B) {
// Step 1: Build adjacency graph (0-indexed)
vector<vector<int>> G(N);
for (int i = 0; i < M; i++) {
A[i]--; B[i]--; // convert to 0-indexed
G[A[i]].push_back(B[i]);
G[B[i]].push_back(A[i]);
}
// Step 2: DFS to create a spanning tree and record tour
vector<int> tour;
vector<bool> visited(N, false);
vector<int> depth(N, 0);
vector<int> extraA, extraB;
function<void(int)> dfs = [&](int u) {
visited[u] = true;
tour.push_back(u);
for (int v : G[u]) {
if (!visited[v]) {
depth[v] = depth[u] + 1;
dfs(v);
tour.push_back(u);
} else if (depth[u] < depth[v]) {
extraA.push_back(u);
extraB.push_back(v);
}
}
};
dfs(0);
// Step 3: Assign ranks for tour positioning
vector<int> rank(N, -1), holder(N, -1);
int L = tour.size();
for (int i = 0; i < L; i++) {
int d = min(i, L - 1 - i);
if (rank[tour[i]] < d) {
rank[tour[i]] = d;
holder[tour[i]] = i;
}
}
// Step 4: Prepare adjacency lists for extra edges
vector<vector<int>> extra(N);
for (int i = 0; i < (int)extraA.size(); i++) {
if (rank[extraA[i]] < rank[extraB[i]]) swap(extraA[i], extraB[i]);
extra[extraA[i]].push_back(extraB[i]);
}
// Step 5: Construct grid
int K = 2 * N;
vector<vector<int>> grid(K, vector<int>(K, 0));
int cur = 0;
for (int i = 0; i < L; i++) {
int u = tour[i];
if (i == holder[u]) {
int pos = 0;
for (int j = 0; j < K; j++) {
int a = cur - j;
if (0 <= a && a < K) grid[j][a] = u;
int b = cur + 1 - j;
if (0 <= b && b < K) {
if (pos < (int)extra[u].size()) {
grid[j][b] = extra[u][pos++];
} else {
grid[j][b] = u;
}
}
int c = cur + 2 - j;
if (0 <= c && c < K) grid[j][c] = u;
}
cur += 3;
} else {
for (int j = 0; j < K; j++) {
int a = cur - j;
if (0 <= a && a < K) grid[j][a] = u;
}
cur += 1;
}
}
// Step 6: Convert back to 1-indexed colors
for (int i = 0; i < K; i++)
for (int j = 0; j < K; j++)
grid[i][j]++;
return grid;
}
