Search
Duplicate

DFS와 BFS

주차
15
문제번호
1260
언어
C++
티어
실버
유형
BFS
DFS
nj_Blog
nj_상태
완료
이해도
풀이
사람
이해도 2
13 more properties

Memo

로직 설명

공통 - 현재 index를 기준으로 인접해 있는 노드들을 탐색합니다.
깊이 우선 탐색(DFS) - 인접한 노드들을 바로 다 방문하지 않고, 현재 인접한 노드들 중 첫 번째 노드를 방문하고, 그 방문한 노드와 인접한 노드들 중 첫 번째 노드를 방문하는 식으로 탐색합니다.
너비 우선 탐색(BFS) - 인접한 노드들을 모두 탐색하고, 그 인접한 노드들의 인접한 노드들을 탐색합니다.

자료 구조

DFS, BFS

코드 설명

void dfs(int index)
std::sort(graph[index].begin(), graph[index].end()); → 현재 인접한 노드들은 오름차순이어야 하기 때문에 정렬해줍니다.

어려웠던 부분

PASS

개선할 부분

PASS

Code

제출 날짜

@4/9/2021

메모리

2308 KB

시간

0 ms
#include <iostream> #include <vector> #include <cstring> #include <queue> #include <algorithm> int N, M, V; std::vector<int> graph[1001]; bool visited[1001]; void input_faster() { std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); } void input() { int a, b; input_faster(); std::cin >> N >> M >> V; for (int i = 0 ; i < M ; i++) { std::cin >> a >> b; graph[a].push_back(b); graph[b].push_back(a); } } void dfs(int index) { std::cout << index << " "; std::sort(graph[index].begin(), graph[index].end()); for (size_t i = 0 ; i < graph[index].size(); i++) { if (visited[graph[index][i]]) continue; visited[graph[index][i]] = 1; dfs(graph[index][i]); } } void bfs() { int x; std::queue<int> q; q.push(V); visited[V] = 1; while(!q.empty()) { x = q.front(); q.pop(); std::cout << x << " "; for (size_t i = 0 ; i < graph[x].size() ; i++) { if (visited[graph[x][i]]) continue; visited[graph[x][i]] = 1; q.push(graph[x][i]); } } } void solve() { visited[V] = 1; dfs(V); std::cout << "\n"; std::memset(visited, 0, sizeof(visited)); bfs(); } int main() { input(); solve(); return (0); }
C++
복사