제출 #1273368

#제출 시각아이디문제언어결과실행 시간메모리
1273368strange420세계 지도 (IOI25_worldmap)C++20
22 / 100
15 ms3300 KiB
#include "worldmap.h"
#include <algorithm>
#include <iostream>
#include <functional>
#include <utility>
#include <cmath>
#include <cassert>

std::vector<std::vector<int>> create_map(int N, int M, std::vector<int> A, std::vector<int> B) {
  std::vector<std::vector<int>> adj_matrix(N+1, std::vector<int>(N+1, 0));
  std::vector<std::vector<int>> hist_matrix(N+1, std::vector<int>(N+1, 0));
  for (int i=0; i<M; i++)
    adj_matrix[A[i]][B[i]] = 
      adj_matrix[B[i]][A[i]] =
        hist_matrix[A[i]][B[i]] = 
          hist_matrix[B[i]][A[i]] = 1;

  std::vector<std::vector<int>> grid;
  auto fill = [&](std::vector<int>& path) {
    if (path.size() == 0) path.push_back(1);
    std::vector<int> ans;
    for (int x: path) ans.push_back(x);
    for (int i=path.size(); i<2*N; i++) {
      ans.push_back(path[path.size()-1]);
    }
    std::reverse(ans.begin(), ans.end());
    grid.push_back(ans);
  };
  
  std::function<void(int)> dfs;
  std::vector<int> visited(N+1, 0), path;
  dfs = [&](int u) {
    visited[u] = 1;
    path.push_back(u); path.push_back(u);
    fill(path);
    for (int v=1; v<=N; v++) {
      if (adj_matrix[u][v] && !visited[v]) {
        adj_matrix[u][v] = 
          adj_matrix[v][u] = 0;
        dfs(v);
      }
    }
    path.pop_back(); path.pop_back();
    fill(path);
  }; dfs(1);

  std::function<void(int, int)> resolve = [&](int u, int v) {
    int pt = 0;
    for (int pt=0; pt<grid.size(); pt++)
      for (int i=0; i<grid[pt].size() && grid[pt].front() == v; i+=2)
        if (grid[pt][i] == u && grid[pt][i+1] == u) {
          if (i+2 >= grid[pt].size()) {
            grid[pt][i+1] = v;
          } else if (grid[pt][i+2] != u && hist_matrix[grid[pt][i+2]][v]) {
            grid[pt][i+1] = v;
          } else {
            grid[pt][i+1] = v;
            grid[pt][i+2] = u;
          } break;
        }
  };
  for (int i=1; i<=N; i++)
    for (int j=1; j<=N; j++)
      if (adj_matrix[i][j]) {
        adj_matrix[i][j] = 
          adj_matrix[j][i] = 0;
        resolve(i, j);
      }

  return grid;
}
#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...