문제 링크: https://www.acmicpc.net/problem/17352
유니온 파인드 문제입니다.
입력대로 merge를 하면 섬들이 두 그룹으로 나뉩니다.
0번 섬의 루트를 저장한 뒤 이걸 나머지 섬 루트랑 비교했을 때 루트 인덱스가 다르면 다른 그룹에 들어있는 거니까 두 그룹의 루트를 이어주면 됩니다. 두 섬 자체를 이어줘도 되고요.
아무 방법으로 이으면 된다고 하니 적당히 이어주면 됩니다.
#pragma GCC optimize ("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2")
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> graph;
vector<int> parent;
void init(int n) {
parent.resize(n);
for (int i = 0; i < n; ++i)
parent[i] = i;
}
int find(int u) {
if (u == parent[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;
parent[u] = v;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
init(n);
int a, b;
for (int i = 0; i < n - 2; ++i) {
cin >> a >> b;
--a, --b;
merge(a, b);
}
int c = find(0);
for (int i = 1; i < n; ++i) {
int d = find(i);
if (c != d) {
cout << c + 1 << ' ' << d + 1 << '\n';
break;
}
}
return 0;
}
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 4358: 생태학 (0) | 2020.05.30 |
---|---|
[백준][C++] 12790: Mini Fantasy War (0) | 2020.05.29 |
[백준][C++] 1976: 여행 가자 (0) | 2020.05.27 |
[백준][C++] 15809: 전국시대 (0) | 2020.05.26 |
[백준][C++] 14595: 동방 프로젝트 (Large) (0) | 2020.05.25 |