hades

[Baekjoon] 11724๋ฒˆ: ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜ ๋ณธ๋ฌธ

๐Ÿ‘Š PS/Algorithm

[Baekjoon] 11724๋ฒˆ: ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜

hades1 2024. 7. 25. 21:26

๐Ÿฅ… ๋ฌธ์ œ

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

 

๐Ÿ” ์„ค๊ณ„

์„œ๋กœ์†Œ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ๋œ ๊ฒƒ๋“ค๋ผ๋ฆฌ ๊ทธ๋ฃน์„ ํ˜•์„ฑํ•˜๊ฒŒ ํ•œ๋‹ค.

 

๊ทธ๋ฃน์˜ ์ˆ˜๋Š” ๋งจ ๊ผญ๋Œ€๊ธฐ์— ์žˆ๋Š” ์กฐ์ƒ์˜ ์ˆ˜์ด๋‹ค.

 

๋ฌธ์ œ ์ž…๋ ฅ ์ˆœ์„œ์— ๋”ฐ๋ผ parent[x]๊ฐ€ ๋งจ ๊ผญ๋Œ€๊ธฐ ์กฐ์ƒ์ด ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, find_parent(x)๋กœ ๋งจ ๊ผญ๋Œ€๊ธฐ ์กฐ์ƒ์„ ์ง‘ํ•ฉ์— ์‚ฝ์ž…ํ•œ๋‹ค.

 


BFS๋กœ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์—ฌ ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

๐Ÿ‘Š ํ’€์ด1

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

int n, m, u, v;
vector<int> parent(1001);
set<int> result;

int find_parent(int x) {
	if (parent[x] != x) {
		return find_parent(parent[x]);
	}
	return parent[x];
}

void union_parent(int a, int b) {
	a = find_parent(a);
	b = find_parent(b);
	if (a < b) {
		parent[b] = a;
	}
	else {
		parent[a] = b;
	}
}

int main(void)
{	
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;

	for (int i = 1; i <= n; i++) {
		parent[i] = i;
	}

	for (int i = 0; i < m; i++) {
		cin >> u >> v;
		union_parent(u, v);
	}
	
	for (int i = 1; i <= n; i++) {
		result.insert(find_parent(i));
	}
	cout << result.size() << "\n";

	return 0;
}

 

๐Ÿ‘Š ํ’€์ด2

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;

int n, m, u, v, result = 0;
vector<int> visited(1001);
vector<vector<int>> adj_list(1001);

void bfs(int start) {
	visited[start] = true;
	queue<int> q;
	q.push(start);
	while (!q.empty()) {
		int cur = q.front();
		q.pop();
		int size = adj_list[cur].size();
		for (int i = 0; i < size; i++) {
			int next = adj_list[cur][i];
			if (!visited[next]) {
				visited[next] = true;
				q.push(next);
			}
		}
	}
}

int main(void)
{	
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n >> m;

	for (int i = 0; i < m; i++) {
		cin >> u >> v;
		adj_list[u].push_back(v);
		adj_list[v].push_back(u);
	}

	for (int i = 1; i <= n; i++) {
		if (!visited[i]) {
			result += 1;
			bfs(i);
		}
	}

	cout << result << "\n";

	return 0;
}