-
KOI 2017 고등부 2번 / 문명 - 14868Algorithm/BOJ 2020. 9. 12. 21:5512345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394#include <iostream>#include <queue>using namespace std;int N, K;vector<vector<int>> arr;queue<pair<int, int>> Q[2];int xarr[4] = {0, 0, 1, -1};int yarr[4] = {1, -1, 0, 0};bool eFlag = true;struct DisjointSet {vector<int> parent, rank;int tNum;DisjointSet() : parent(K), rank(K, 0), tNum(K) {for(int i = 0; i<K; ++i)parent[i] = i;}int find(int u) {if(parent[u] == u) return u;return parent[u] = find(parent[u]);}void merge(int u, int v) {u = find(u);v = find(v);if(u == v) return;if(rank[u] < rank[v]) swap(u, v);parent[v] = u;if(rank[u] == rank[v]) ++rank[u];--tNum;if(1 == tNum) eFlag = false;}};bool check(int u, int v) {if(u < 1 || u > N || v < 1 || v > N) return false;return true;}void init(DisjointSet& set) {arr = vector<vector<int>>(N+1, vector<int>(N+1, -1));Q[0] = Q[1] = queue<pair<int, int>>();int u, v;for(int i = 0; i<K; ++i) {cin >> u >> v;arr[u][v] = i;for(int j = 0; j<4; ++j) {int au = u + xarr[j];int av = v + yarr[j];if(check(au, av))if(arr[au][av] != -1) set.merge(arr[u][v], arr[au][av]);}Q[0].push(make_pair(u, v));}}int main() {ios_base::sync_with_stdio(0), cin.tie(0);cin >> N >> K;DisjointSet set;init(set);int cnt = 0;while(eFlag) {while(eFlag && !Q[cnt%2].empty()) {int x = Q[cnt%2].front().first;int y = Q[cnt%2].front().second;Q[cnt%2].pop();for(int i = 0; i<4; ++i) {int nx = x+xarr[i], ny = y+yarr[i];if(check(nx, ny)) {if(arr[nx][ny] == -1) {Q[(cnt+1)%2].push(make_pair(nx, ny));arr[nx][ny] = arr[x][y];for(int j = 0; j<4; ++j) {int nnx = nx+xarr[j], nny = ny+yarr[j];if(check(nnx, nny)) {if(arr[nnx][nny] != -1) set.merge(arr[x][y], arr[nnx][nny]);}}}}}}++cnt;}cout << cnt;}
cs 14868번: 문명
표준 입력으로 다음 정보가 주어진다. 첫 번째 줄에는 세계의 크기를 나타내는 정수 N(2 ≤ N ≤ 2,000)과 문명 발상지의 수 K(1 ≤ K ≤ 100,000)가 주어진다. 다음 K줄에는 한 줄에 하나씩 문명 발상지�
www.acmicpc.net
문명
BFS와 유니온-파인드로 해결할 수 있습니다. 주의할 점은 문명끼리 이어질때는 추가된 영토에 인접한 다른 문명이 있으면 이어지는데 맨 처음 주어지는 데이터에선 인접해 있더라도 같은 문명으로 취급되지 않는 데이터가 들어오기 때문에 인접한 문명끼리 하나의 문명으로 합쳐주는 전처리과정이 필요합니다.
'Algorithm > BOJ' 카테고리의 다른 글
KOI 2018 중등부 3번 / 물탱크 - 15972 (0) 2020.09.10 KOI 2019 1차 고등부 2번 / 점프 - 17613 (0) 2020.08.30 KOI 2018 초등부 1번 / 행복 - 15969 (0) 2020.08.24 KOI 2019 1차 고등부 1번 / 쇼핑몰 - 17612 (0) 2020.08.24 KOI 2019 1차 중등부 2번 / 직각다각형 - 17611 (0) 2020.08.24