1일1알

백준 17352번 여러분의 다리가 되어 드리겠습니다! C++ 본문

알고리즘

백준 17352번 여러분의 다리가 되어 드리겠습니다! C++

영춘권의달인 2022. 10. 12. 17:02

https://www.acmicpc.net/problem/17352

 

17352번: 여러분의 다리가 되어 드리겠습니다!

선린월드에는 N개의 섬이 있다. 섬에는 1, 2, ..., N의 번호가 하나씩 붙어 있다. 그 섬들을 N - 1개의 다리가 잇고 있으며, 어떤 두 섬 사이든 다리로 왕복할 수 있다. 어제까지는 그랬다. "왜 다리

www.acmicpc.net

 

유니온 파인드

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;

int n;

vector<int> height;
vector<int> parent;

int GetParent(int a) {
	if (a == parent[a]) return a;
	return parent[a] = GetParent(parent[a]);
}

void Merge(int u, int v) {
	u = GetParent(u);
	v = GetParent(v);

	if (u == v) return;

	if (height[u] > height[v])
		::swap(u, v);

	parent[u] = v;

	if (height[u] == height[v])
		height[v]++;
}

int main()
{
	cin >> n;
	height = vector<int>(n + 1, 1);
	parent = vector<int>(n + 1);
	for (int i = 1; i <= n; i++) {
		parent[i] = i;
	}
	for (int i = 0; i < n - 2; i++) {
		int s, e;
		cin >> s >> e;
		Merge(s, e);
	}
	int _parent = GetParent(1);
	int ans = 0;
	for (int i = 2; i <= n; i++) {
		if (GetParent(i) != _parent) {
			ans = GetParent(i);
			break;
		}
	}
	cout << _parent << " " << ans;
}

'알고리즘' 카테고리의 다른 글

백준 12869번 뮤탈리스크 C++  (0) 2022.10.22
백준 14271번 그리드 게임 C++  (0) 2022.10.14
백준 10974번 모든 순열 C++  (0) 2022.10.11
백준 2056번 작업 C++  (0) 2022.10.10
백준 5397번 키로거 C++  (0) 2022.10.09