Algorithm/๋ฌธ์ œํ’€์ด

[๋ฐฑ์ค€] 1260๋ฒˆ - DFS์™€ BFS (C++)

moaoh 2023. 7. 2. 23:53

๋ฌธ์ œ

๊ทธ๋ž˜ํ”„๋ฅผ DFS๋กœ ํƒ์ƒ‰ํ•œ ๊ฒฐ๊ณผ์™€ BFS๋กœ ํƒ์ƒ‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋‹จ, ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ์—๋Š” ์ •์  ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ์„ ๋จผ์ € ๋ฐฉ๋ฌธํ•˜๊ณ , ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ด ์—†๋Š” ๊ฒฝ์šฐ ์ข…๋ฃŒํ•œ๋‹ค. ์ •์  ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€์ด๋‹ค.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000), ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ M(1 ≤ M ≤ 10,000), ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•  ์ •์ ์˜ ๋ฒˆํ˜ธ V๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ M๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ„์„ ์ด ์—ฐ๊ฒฐํ•˜๋Š” ๋‘ ์ •์ ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์–ด๋–ค ๋‘ ์ •์  ์‚ฌ์ด์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ„์„ ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๊ฐ„์„ ์€ ์–‘๋ฐฉํ–ฅ์ด๋‹ค.


์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— DFS๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ, ๊ทธ ๋‹ค์Œ ์ค„์—๋Š” BFS๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. V๋ถ€ํ„ฐ ๋ฐฉ๋ฌธ๋œ ์ ์„ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.


 

์˜ˆ์ œ ์ž…๋ ฅ 1 ๋ณต์‚ฌ

4 5 1
1 2
1 3
1 4
2 4
3 4

์˜ˆ์ œ ์ถœ๋ ฅ 1 ๋ณต์‚ฌ

1 2 4 3
1 2 3 4

์˜ˆ์ œ ์ž…๋ ฅ 2 ๋ณต์‚ฌ

5 5 3
5 4
5 2
1 2
3 4
3 1

์˜ˆ์ œ ์ถœ๋ ฅ 2 ๋ณต์‚ฌ

3 1 2 5 4
3 1 4 2 5

์˜ˆ์ œ ์ž…๋ ฅ 3 ๋ณต์‚ฌ

1000 1 1000
999 1000

์˜ˆ์ œ ์ถœ๋ ฅ 3 ๋ณต์‚ฌ

1000 999
1000 999

ํ’€์ด๊ณผ์ •

DFS์™€ BFS์˜ ๊ฐœ๋…์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•ด์•ผ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ธ๊ฑฐ๊ฐ™๋‹ค.

DFS๋Š” ์ฝ”๋“œ์—์„œ ๋ณด์ด๋Š” ๋ชจ์Šต์ฒ˜๋Ÿผ ์ •์ ์„ ์žก๊ณ  ๊ทธ ์ •์ ์„ ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ํƒ€๊ณ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€์„œ ๋๊นŒ์ง€ ๋“ค์–ด๊ฐ€์„œ ๋„์ฐฉํ•ด์•ผ๋งŒ ๋‹ค๋ฅธ ์ •์ ์„ ๊ฑด๋“œ๋Š” ๋ฐฉ์‹์ด๊ณ ,

BFS๋Š” ์„ ์ž…์„ ์ถœ์ธ queue๋ฅผ ํ†ตํ•ด์„œ ๋ฐ˜๋ณต๋ฌธ์„ ๋„๋Š” ๊ธฐ์ค€์„ queue๋กœ ์žก๊ณ  ๋ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜์–ด ์žฌ๊ท€์™€ ๋‹ค๋ฅด๊ฒŒ i ๋ถ€ํ„ฐ n ๊นŒ์ง€ ๊ฐ„์„ ์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ๊ฐ„์ ๋“ค์„ ๋“ค๋ ธ๋‹ค๊ฐ€ ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

code

#include <iostream>
#include <vector>
#include <queue>

int	a[1001][1001];
int visit[1001] = {0,};

void	bfs(int v, int n)
{
	std::queue<int> q;
	int visit[1001] = {0,};
	q.push(v);
	visit[v] = true;
	std::cout << v << " ";
	while (!q.empty()) {
		int temp = q.front();
		q.pop();
		for(int j = 1; j <= n; j++) {
			if (a[j][temp] && !visit[j]) {
				std::cout << j << " ";
				q.push(j);
				visit[j] = true;
			}
		}
	}
}

void	dfs(int v, int n)
{
	visit[v] = true;
	std::cout << v << " ";
	for(int i = 1; i <= n; i++) {
		if (a[v][i] && !visit[i]) {
			dfs(i, n);
		}
	}
}

int	main(void)
{
	int n, m, v;
	int y, x;
	
	std::cin >> n >> m >> v;
	for(int i = 0; i < m; i++) {
		std::cin >> y >> x;
		a[y][x] = 1;
		a[x][y] = 1;
	}
	dfs(v, n);
	std::cout << "\n";
	bfs(v, n);

	return (0);
}

 


ํ›„๊ธฐ

bfs๋ž‘ dfs๋Š” ๊ฐœ๋…๋งŒ ์žก์•„๋‘๋ฉด ํ™•์‹คํžˆ ํ™œ์šฉ๋„๊ฐ€ ์ข‹์•„์„œ ์•Œ์•„๋‘๋ฉด ๋‹ค๋ฐฉ๋ฉด์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ์–ด์„œ ํ™•์‹คํ•˜๊ฒŒ ์งš์œผ๋ฉด์„œ ๋„˜์–ด๊ฐ€๋Š” ๋А๋‚Œ์œผ๋กœ ํ’€์—ˆ์—ˆ๋‹ค.