https://www.acmicpc.net/problem/17352
전형적인 분리집합 문제이다.
주어진 edge의 vertex를 모두 union하게 되면 입력 조건에 의해 단 한개의 구간만 parent가 다르게 나온다.
이를 나머지 vertex 중 아무 것과 잇게되면 어떤 두 섬 사이든 왕복할 수 있게 된다.
#include <iostream>
#include <vector>
using namespace std;
int parent[300001];
int findParent(int k){
if (parent[k] == k) {
return k;
}
return parent[k] = findParent(parent[k]);
}
void merge(int a, int b){
if (findParent(a) == findParent(b)) {
return;
} else if (a < b) {
parent[findParent(b)] = findParent(a);
} else if (b < a) {
parent[findParent(a)] = findParent(b);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
vector<int> g[n + 1];
for (int i = 0; i < n - 2; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
for (int i = 1; i <= n; i++) {
parent[i] = i;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < g[i].size(); j++) {
merge(i, g[i][j]);
}
}
int temp = findParent(1);
for (int i = 2; i <= n; i++) {
if (temp != findParent(i)) {
cout << temp << " " << findParent(i);
return 0;
}
}
return 0;
}
'Coding Test' 카테고리의 다른 글
백준 15486 퇴사 2 (2) | 2024.03.20 |
---|---|
백준 2448 별 찍기 (11) (0) | 2024.03.19 |
백준 21314 민겸 수 (1) | 2024.03.19 |
백준 16953 A → B (2) | 2024.03.17 |
백준 19637 IF문 좀 대신 써줘 (2) | 2024.03.16 |