Deff_Dev

[백준] 1260번 DFS와 BFS (C++) 본문

코딩테스트/백준

[백준] 1260번 DFS와 BFS (C++)

Deff_a 2024. 2. 29. 12:46
 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

 

문제

이 문제는 DFS와 BFS를 처음 공부하기에 가장 좋은 문제 중 하나다.

 

입력한 간선을 토대로 양방향 그래프를 만들고 시작 지점부터 DFS, BFS를 이용해 탐색하면 된다.

 

풀이

#include<iostream>
#include<queue>
// https://www.acmicpc.net/problem/1260 DFS와 BFS
using namespace std;

int map[1001][1001] = {0, }; // 맵
bool visited[1001] = {false, }; // 방문 한 노드 체크하는 배열

void DFS(int N,int V) { // DFS
	visited[V] = true; // 방문 표시
	cout << V << " ";
	for (int i = 1; i <= N; i++) {
		// 방문하지 않은 인접한 노드라면 해당 노드 호출
		if (visited[i] == false && map[V][i] == 1) {
			DFS(N,i);
		}
	}
}

void BFS(int N, int V) {
	queue<int> q; // 큐 생성

	visited[V] = true; // 방문 표시
	q.push(V); // 첫번째 노드 푸쉬
	cout << V << " ";

	while (!q.empty()) {
		int front = q.front(); // 맨 앞 노드 값 저장
		q.pop(); // 팝

		for (int i = 1; i <= N; i++) {
			// 방문하지 않은 인접한 노드라면 해당 노드 푸쉬 및 방문 표시
			if (visited[i] == false && map[front][i] == 1) { 
				q.push(i);
				visited[i] = true;
				cout << i << " ";
			}
		}
	}
}

void Reset(int N) { // 초기화
	cout << "\n";
	for (int i = 1; i <= N; i++) {
		visited[i] = false;
	}
}

int main() {
	int N, M, V, x, y; // 변수 선언

	cin >> N >> M >> V; // 입력

	for (int i = 0; i < M; i++) {  // 노드 입력 및 매핑
		cin >> x >> y;
		map[x][y] = map[y][x] = 1; 
	}

	DFS(N, V); // DFS
	Reset(N); // Visited 배열 초기화
	BFS(N, V); // BFS
}

 

 

 

 

'코딩테스트 > 백준' 카테고리의 다른 글

[백준] 2178번 미로탐색 (C++)  (0) 2024.03.01
[백준] 9012번 괄호 (C++)  (0) 2024.03.01
[백준] 11399번 ATM (C++)  (0) 2024.03.01
[백준] 1697번 숨바꼭질 (C++)  (0) 2024.03.01
[백준] 1152번 단어의 개수 (C++)  (0) 2024.02.28