-
네트워크 연결 - 3780Algorithm/BOJ 2020. 4. 1. 14:19123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869//3780 - 네트워크 연결#include <iostream>#include <vector>using namespace std;int N;int Dist(int u, int v){int ret = (u - v > 0 ? u - v : v - u);return ret % 1000;}struct DisjointSet{vector<int> parent, dist;DisjointSet(int n) : parent(n), dist(n, 0){for (int i = 0; i < n; ++i)parent[i] = i;}int find(int u){if(u == parent[u]) return u;int par = find(parent[u]);dist[u] += dist[parent[u]];return parent[u] = par;}void merge(int u, int v){dist[u] = Dist(u, v);parent[u] = v;}};int main(){ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);int C;cin >> C;for (int tn = 0; tn < C; ++tn){cin >> N;DisjointSet set(N+1);char c;while (true){cin >> c;int u, v;if (c == 'E'){cin >> u;set.find(u);cout << set.dist[u] << "\n";}else if (c == 'I'){cin >> u >> v;set.merge(u, v);}elsebreak;}}}
cs https://www.acmicpc.net/problem/3780
3780번: 네트워크 연결
문제 종빈이는 아주 큰 그룹의 총수다. 이 그룹은 1부터 N번까지의 번호로 구분할 수 있는 N개의 기업을 운영하고 있다. 현재 각 기업은 서로 독립적인 자체 컴퓨팅 및 통신센터를 가지고 있다. 어느 날 종빈이는 계열사의 CTO인 서현이에게 서비스 개선을 위해 각 기업의 서버를 네트워크로 연결하여 단일 통신센터에서 관리 가능한 클러스터 형태로 구성할 것을 제안했다. 종빈이의 제안을 들은 서현이는 다음과 같은 병합 과정을 고안해냈다. 클러스터 A를 제공하는
www.acmicpc.net
네트워크 연결
트리로 모델링이 가능하고, 트리들끼리 합쳐질때, 서브트리의 각각의 노드로부터 루트노드의 거리를 갱신해 주어야 합니다. 2만개의 노드에 최대 2만번 트리들끼리 합쳐지니 빠르게 갱신할 수 있는 방법이 필요한데, 이때 disjointset 자료구조를 변형하면 빠른시간내에 갱신할 수 있겠다 생각했습니다. 마침 find함수는 루트노드를 찾을때까지 계속 위로 올라가는 함수이고, 재귀함수로 짜여져 있으니 재귀함수들이 반환될때 루트노드까지의 거리를 갱신해 준다면, 큰 시간복잡도 차이없이 구할 수 있겠다 싶었습니다.
'Algorithm > BOJ' 카테고리의 다른 글
세 용액 - 2473 (0) 2020.04.16 소가 길을 건너간 이유 6 - 14466 (0) 2020.04.01 정점들의 거리 - 1761 (0) 2020.03.30 알파벳 - 1987 (0) 2020.03.29 N-Queen - 9663 (0) 2020.03.29