# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1251020 | David_M | World Map (IOI25_worldmap) | C++20 | 0 ms | 0 KiB |
#include "worldmap.h"
#include<bits/stdc++.h>
using namespace std;
void color(int d, int val, vector<vector<int>> &ans) {
for (int i = 0; i <= d; ++i)
if (max(i, d-i) < ans.size())
ans[i][d - i] = val + 1;
}
void dfs(int x, int pa, int n, int &k, vector<vector<int>> &ans, auto &v, auto &f) {
f[x] = 1;
color(k, x, ans);
k++;
for (int y : v[x]) {
if(!f[y])
dfs(y, x, n, k, ans, v, f);
}
if(x == 0) return;
int e = max(0, k - 2 * n + 1);
color(k, x, ans);
color(k+1, x, ans);
color(k+2, pa, ans);
for (int y : v[x])
if(f[y] != 2)
ans[e][k - e] = y + 1,
e++;
k += 3;
f[x] = 2;
}
vector<vector<int>> create_map(int N, int M, vector<int> A, vector<int> B) {
vector<vector<int>> ans(2 * N, vector<int>(2 * N, 1)), v(N);
vector<int> f(N, 0);
for (int i = 0; i < M; ++i) {
v[A[i] - 1].push_back(B[i] - 1);
v[B[i] - 1].push_back(A[i] - 1);
}
int k = 0;
dfs(0, 0, N, k, ans, v, f);
return ans;
}
//#include "worldmap.h"
#include <cassert>
#include <cstdio>
int main() {
int T;
assert(1 == scanf("%d", &T));
std::vector<int> Nt(T), Mt(T);
std::vector<std::pair<std::vector<int>, std::vector<int>>> AB;
for (int t = 0; t < T; ++t) {
assert(2 == scanf("%d %d", &Nt[t], &Mt[t]));
int M = Mt[t];
std::vector<int> A(M), B(M);
for (int i = 0; i < Mt[t]; i++) {
assert(2 == scanf("%d %d", &A[i], &B[i]));
}
AB.push_back(make_pair(A, B));
}
fclose(stdin);
std::vector<std::vector<std::vector<int>>> Ct;
for (int t = 0; t < T; t++) {
int N = Nt[t], M = Mt[t];
std::vector<int> A = AB[t].first, B = AB[t].second;
auto C = create_map(N, M, A, B);
Ct.push_back(C);
}
for (int t = 0; t < T; t++) {
auto& C = Ct[t];
int P = (int)C.size();
std::vector<int> Q(P);
for (int i = 0; i < P; ++i)
Q[i] = (int)C[i].size();
printf("%d\n", P);
for (int i = 0; i < P; ++i)
printf("%d%c", Q[i], " \n"[i + 1 == P]);
printf("\n");
for (int i = 0; i < P; i++) {
for (int j = 0; j < Q[i]; j++) {
printf("%d%c", C[i][j], " \n"[j + 1 == Q[i]]);
}
}
if (t < T - 1)
printf("\n");
}
fclose(stdout);
return 0;
}