제출 #1347961

#제출 시각아이디문제언어결과실행 시간메모리
1347961orgiloogiiWorld Map (IOI25_worldmap)C++20
72 / 100
56 ms9600 KiB
#include "worldmap.h"
#include <bits/stdc++.h>
using namespace std;
vector <vector <pair <int, bool>>> order;
vector <vector <int>> adj;
vector <bool> vis;
void dfs(int u, int p, int r) {
    // cout << u << ' ';
    if (adj[u].size() == 0) return;
    order[r].push_back({u, 1});
    order[r].push_back({u, 1});
    order[r].push_back({u, 1});
    for (auto v : adj[u]) {
        if (vis[v]) continue;
        vis[v] = true;
        dfs(v, u, r);
        order[r].push_back({u, 0});
    }
    if (p == -1) return;
}
vector<vector<int>> create_map(int n, int m, vector<int> a, vector<int> b) {
    int k = 4 * n;
    vis.assign(n + 1,0);
    order.assign(n + 1, {});
    vector<vector<int>> ans(k, vector<int>(k, 0));
    adj.assign(n + 1, {});
    int cnt[n + 1] = {0};
    for (int i = 0;i < m;i++) {
        adj[a[i]].push_back(b[i]);
        adj[b[i]].push_back(a[i]);
    }
    for (int i = 1;i <= n;i++) {
        vis.assign(n + 1, 0);
        vis[i] = true;
        dfs(i, -1, i);
    }
    int min = INT_MAX;
    int root = 0;
    for (int i = 1;i <= n;i++) {
        if (order[i].size() < min) {
            min = order[i].size();
            root = i;
        }
    }
    int i = 0;
    for (;i < order[root].size();i++) {
        if (i >= order[root].size()) break;
        int x = order[root][i].first;
        int y = order[root][i].second;
        if (y == 0) {
            for (int j = 0;j < k;j++) {
                ans[i][j] = x;
            }
        }
        else {
            i += 2;
            if (i >= order[root].size()) break;
            for (int j = 0;j < k;j++) {
                ans[i - 2][j] = x;
            }
            for (int j = 0;j < k;j++) {
                ans[i][j] = x;
            }
            int iter = 0;
            for (auto v : adj[x]) {
                ans[i - 1][iter] = v;
                ans[i - 1][iter + 1] = x;
                iter += 2;
            }
            for (;iter < k;iter++) {
                ans[i - 1][iter] = x;
            }
        }
    }
    for (;i < k;i++) {
        for (int j = 0;j < k;j++) {
            ans[i][j] = root;
        }
    }
    return ans;
}
/*
1
4 4
1 2
1 3
2 4
3 4
1 2 4 3
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...