제출 #1346853

#제출 시각아이디문제언어결과실행 시간메모리
1346853OgradL세계 지도 (IOI25_worldmap)C++20
86 / 100
28 ms5492 KiB
#include "worldmap.h"
#include <functional>
#include <vector>
using namespace std;

vector<vector<int>> create_map(int N, int M, vector<int> A, vector<int> B) {

	vector<vector<int>> ans(3*N, vector<int>(3*N, 1));

	vector<vector<int>> adj(N);
	for (int i = 0; i < M; i++){
		A[i]--; B[i]--;
		adj[A[i]].push_back(B[i]);
		adj[B[i]].push_back(A[i]);
	}

	vector<pair<int, int>> back_edges;
	vector<int> depth(N, -1), tin(N), tout(N);
	int tour = 0;

	function<void(int, int, int, int, int)> draw = [&](int x0, int y0, int x1, int y1, int col) -> void {
		for (int i = x0; i <= x1; i++){
			for (int j = y0; j <= y1; j++){
				ans[i][j] = col+1;
			}
		}
	};

	function<void(int, int, int)> dfs = [&](int v, int p, int d){
		depth[v] = d;

		draw(tour, 3*depth[v], tour, 3*N-1, v);

		tin[v] = tour++;

		for (int x : adj[v]){
			if (x == p) continue;
			if (depth[x] != -1){
				back_edges.push_back({v, x});
				continue;
			}
			dfs(x, v, d+1);

			draw(tour, 3*depth[v], tour, 3*N-1, v);
			tour++;
		}
		tout[v] = tour-1;

		draw(tin[v], 3*depth[v], tout[v], 3*depth[v] + 2, v);
	};

	dfs(0, 0, 0);

	for (auto [a, b] : back_edges){
		if (depth[a] > depth[b])
			swap(a, b);
		draw(tin[b], 3*depth[a]+1, tin[b], 3*depth[a]+1, b);
	}

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