๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“• STUDY/Algorithm

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

๋ฐฑ์ค€ 1152๋ฒˆ : https://www.acmicpc.net/problem/1260

 

1152๋ฒˆ: ๋‹จ์–ด์˜ ๊ฐœ์ˆ˜

์ฒซ ์ค„์— ์˜์–ด ๋Œ€์†Œ๋ฌธ์ž์™€ ๊ณต๋ฐฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 1,000,000์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๋‹จ์–ด๋Š” ๊ณต๋ฐฑ ํ•œ ๊ฐœ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ, ๊ณต๋ฐฑ์ด ์—ฐ์†ํ•ด์„œ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค. ๋˜ํ•œ ๋ฌธ์ž์—ด

www.acmicpc.net

โœ… ๋ฌธ์ œ ์„ค๋ช…

์ด ๋ฌธ์ œ๋Š” DFS BFS๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฌธ์ œ๋กœ

์ •์ ์˜ ๊ฐœ์ˆ˜ N, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ M, ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•  ์ •์ ์˜ ๋ฒˆํ˜ธ V๋ฅผ ์ž…๋ ฅํ•˜๊ณ ,

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


โœ… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๋ช…

๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด,

DFS(๊นŠ์ด์šฐ์„ ํƒ์ƒ‰)๋Š” ์Šคํƒ, BFS(๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰)๋Š” ํ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

DFS๋Š” ์ •์  V๋ฅผ ์‹œ์ž‘์œผ๋กœ ๊ทธ ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ์ •์ ๋“ค์„ ๋ชจ๋‘ ์ฐพ์€ ํ›„,

๋” ์ด์ƒ ์—ฐ๊ฒฐ๋œ ๊ฒƒ์ด ์—†์œผ๋ฉด ๋น ์ ธ๋‚˜์™€ ๋‹ค์Œ ์ •์ ์„ ํƒ์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค.

 

๊ทธ์— ๋ฐ˜ํ•ด BFS๋Š” ์ •์  V์™€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ๋ชจ๋“  ์ •์ ๋“ค์„ ํƒ์ƒ‰ํ•˜๊ณ ,

๊ทธ ๋‹ค์Œ ๋ ˆ๋ฒจ์˜ ์ •์ ๋“ค์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ง„ํ–‰๋œ๋‹ค.

 

DFS๋Š” ์ •์  V๋ฅผ ์‹œ์ž‘์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ •์ ๋“ค์„ ์ฐจ๋ก€๋กœ ์Šคํƒ์— pushํ•˜๊ณ ,

ํƒ์ƒ‰ํ•  ๋•Œ๋งˆ๋‹ค ์Šคํƒ์—์„œ popํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

 

BFS๋Š” ์ •์  V์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ์ •์ ๋“ค์„ ์ฐจ๋ก€๋กœ ํ์— pushํ•˜๊ณ ,

์•ž์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ popํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.


โšก [ DFS (๊นŠ์ด์šฐ์„ ํƒ์ƒ‰) ]

 

1. ์ •์  V๋กœ ๋“ค์–ด๊ฐ

 

2. ์ •์  V์—์„œ ์ œ์ผ ์ž‘์€ ์ˆ˜ A๋กœ ๋“ค์–ด๊ฐ

-1) A์—์„œ ์ œ์ผ ์ž‘์€ ์ˆ˜ A-1๋กœ ๋“ค์–ด๊ฐ

-2) A-2, A-3, A-4 ... ์ญ‰์ญ‰ ๋“ค์–ด๊ฐ€์„œ ๋”์ด์ƒ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋‚˜์˜ด

-3) A-4์—์„œ ๋‚˜์™”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด A-3๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„๊ฐ

-4) A-3์„ ๋‚˜์˜ค๋ฉด A-2์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ, A-2๋ฅผ ๋‚˜์˜ค๋ฉด A-1๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ์ญ‰์ญ‰ ์ฐพ์•„๊ฐ

 

3. ๊ฒฐ๊ตญ A๋ฅผ ๋‹ค ํƒ์ƒ‰ํ•˜๋ฉด ์ •์  V์™€ ์—ฐ๊ฒฐ๋˜๋ฉฐ, A๋‹ค์Œ์œผ๋กœ ์ž‘์€ ์ˆ˜ B ํƒ์ƒ‰

 

4. ๋ชจ๋“  ๊ฐ„์„ ์„ ํƒ์ƒ‰ํ•  ๋•Œ๊นŒ์ง€ 2๋ฒˆ ํƒ์ƒ‰ ๋ฐ˜๋ณต


โšก [ BFS (๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰) ]

 

1. ์ •์  V๋กœ ๋“ค์–ด๊ฐ

 

2. ์ •์  V์™€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ A,B,C....๋ฅผ ์ž‘์€ ์ˆ˜๋ถ€ํ„ฐ ํƒ์ƒ‰

-1) ๊ทธ ๋‹ค์Œ์œผ๋กœ A,B,C...์™€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ A-1, B-1, C-1์„ ์ฐจ๋ก€๋กœ ํƒ์ƒ‰

-2) A-2, B-2, C-2... -> A-3, B-3, C-3... ์ด๋Ÿฐ์‹์œผ๋กœ ๊ณ„์†ํ•ด์„œ ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ์ •์ ๋“ค์„ ํƒ์ƒ‰

 

3. ๋ชจ๋“  ๊ฐ„์„ ์„ ํƒ์ƒ‰ํ•  ๋•Œ๊นŒ์ง€ 2๋ฒˆ ํƒ์ƒ‰ ๋ฐ˜๋ณต


โœ… ์ฝ”๋“œ

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
using namespace std;

// n - ์ •์ ์˜ ๊ฐœ์ˆ˜
// m - ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜
// v - ์ •์ ์˜ ๋ฒˆํ˜ธ
int n, m, v;
int arr[1000][1000] = { 0 }; // ์–‘๋ฐฉํ–ฅ ๊ฐ„์„  (a,b), (b,a) ๋ชจ๋‘ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก 2์ฐจ์› ๋ฐฐ์—ด
int idx_BFS[1000] = { 0 }; // BFS ํƒ์ƒ‰ ์—ฌ๋ถ€ ํ™•์ธ์šฉ
int visit_DFS[1000] = { 0 }; // DFS ํƒ์ƒ‰ ์—ฌ๋ถ€ ํ™•์ธ์šฉ

void start_DFS(int now) {
	printf("%d ", now); // ํƒ์ƒ‰ํ•œ ์ •์  ์ถœ๋ ฅ
	/* ์ •์  now ํƒ์ƒ‰ํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œ */
	visit_DFS[now - 1] = 1; // index๋Š” 0๋ถ€ํ„ฐ๊ธฐ ๋•Œ๋ฌธ์— now-1

	/* ํƒ์ƒ‰ํ•œ ์• ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ œ์ผ ์ž‘์€ ์ˆ˜ ํƒ์ƒ‰ ์‹œ์ž‘ */
	for (int i = 0; i < n; i++) {
		/* ๋ฌด์–ธ๊ฐ€ ๊ฐ’์ด ์žˆ๊ณ  ํƒ์ƒ‰ํ•œ ์  ์—†๋‹ค๋ฉด */
		if ((arr[now - 1][i] == 1) && (visit_DFS[i]) == 0)
			start_DFS(i + 1); // ๊ฑ”๋ฅผ ํƒ์ƒ‰ํ•˜๋„๋ก ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ๋ณด๋‚ด์คŒ
	}
	return;
}

void start_BFS() {
	static int cnt = 0;// ํƒ์ƒ‰ํ•œ ์ •์ ์˜ ๊ฐœ์ˆ˜
	static int idx = 0;// ํƒ์ƒ‰ํ•  ์ •์ ์˜ index
	
	int now = v; // ํƒ์ƒ‰ํ•  ์ •์  ์ €์žฅ
	int *next = (int*)calloc(n, sizeof(int)); // ๋‹ค์Œ ํƒ์ƒ‰ํ•  ์ •์  ์ €์žฅ

	printf("\n%d", now); // ์‹œ์ž‘ ์ •์  ์ถœ๋ ฅ
	/* ๋ชจ๋“  ์ •์  ํƒ์ƒ‰ํ•˜๋ฉด ํƒˆ์ถœ */
	while (cnt < n - 1) {
		for (int i = 0; i < n; i++) { // ๊ฐ™์€ ๋ ˆ๋ฒจ ํƒ์ƒ‰
			/* ํ•ด๋‹น ์ •์ ๊ณผ ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด */
			if (arr[now - 1][i] == 1 && idx_BFS[i] == 1) {
				printf(" %d", i + 1); // ๊ฐ™์€ ๋ ˆ๋ฒจ๋“ค ์ถœ๋ ฅ
				idx_BFS[i] = 0; // ๋‹ค์‹œ ํƒ์ƒ‰ ๋ชปํ•˜๊ฒŒ 0์œผ๋กœ ๋ฐ”๊ฟˆ
				next[cnt] = i + 1; // ๊ฐ™์€ ๋ ˆ๋ฒจ๋“ค ์ €์žฅ
				cnt++; // ์ธ๋ฑ์Šค ++
			}
		}

		/*
		์ฒ˜์Œ ์ •์ ์ด๋ž‘ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ์—†์œผ๋ฉด ๋ฐ”๋กœ break
		๊ฐ„์„  ํ•˜๋‚˜์—ฌ๋„ break
		*/
		if ((now == v && cnt == 0) || (now == v && cnt == 1))
			break;
		else {
			// ์ด์ œ ๊ฐ™์€ ๋ ˆ๋ฒจ ๋‹ค ํƒ์ƒ‰ํ•จ
			idx_BFS[now - 1] = 0; // ์ด ๋ ˆ๋ฒจ์€ ์ด์ œ ํƒ์ƒ‰ํ•จ
			now = next[idx]; // ๋‹ค์Œ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•  ์ •์ ์œผ๋กœ ์ €์žฅ
			idx++; // ์œ„์™€ ๊ฐ™์€ ๋ ˆ๋ฒจ์—์„œ ๊ทธ ๋‹ค์Œ์œผ๋กœ ์ž‘์€ ์ •์ 
		}
	}
	free(next);
	return;
}

int main(void) {
	scanf("%d%d%d", &n, &m, &v);

	/* ๊ฐ„์„ ์˜ ์ˆซ์ž๋งŒํผ ๋ฐ˜๋ณต๋ฌธ */
	int a, b; // ๊ฐ„์„ ์ด ์—ฐ๊ฒฐํ•˜๋Š” ๋‘ ์ •์ ์˜ ๋ฒˆํ˜ธ
	for (int i = 0; i < m; i++) {
		scanf("%d%d", &a, &b);

		/* ์–‘๋ฐฉํ–ฅ ๊ฐ„์„ ์ด๋ฏ€๋กœ ๋‘˜ ๋‹ค ์ €์žฅ */
		arr[a - 1][b - 1] = 1; // (a,b)๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„  ์žˆ๋‹ค๊ณ  ๋ฐ”๊พธ๊ธฐ
		arr[b - 1][a - 1] = 1; // (b,a)๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„  ์žˆ๋‹ค๊ณ  ๋ฐ”๊พธ๊ธฐ

		/* ์ผ๋‹จ ์ด ์ธ๋ฑ์Šค์—๋Š” ์ตœ์†Œ 1๊ฐœ ์ด์ƒ์˜ ๊ฐ’์ด ์žˆ์Œ */
		idx_BFS[a - 1] = 1, idx_BFS[b - 1] = 1;
	}

	if (m == 0) // ๊ฐ„์„ ์ด 0๊ฐœ์ด๋ฉด
		printf("%d\n%d", v, v);
	else {
		start_DFS(v); // ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰
		start_BFS();  // ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰
	}
	return 0;
}

 

ex) N = 4

idx 0 1 2 3
0 0 1 0 0
1 1 0 0 0
2 0 0 0 0
3 0 0 0 0

a=1, b=2๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ (a,b) (b,a) ๋ชจ๋‘ ์ €์žฅํ•˜์—ฌ

1์„ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋ฉด 2๋กœ ์—ฐ๊ฒฐ,

2๋ฅผ ๋จผ์ € ํƒ์ƒ‰ํ•˜๋ฉด 1๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ฆ


https://github.com/2hyunjinn/Baekjoon/blob/main/Baekjoon_1260.cpp

 

GitHub - 2hyunjinn/Baekjoon

Contribute to 2hyunjinn/Baekjoon development by creating an account on GitHub.

github.com