#1. 문제
#2. 풀이
1. BFS(너비 우선 탐색)
- [정의] : BFS(너비 우선 탐색)은 그래프의 모든 노드를 탐색하는 방법 중 하나입니다.
- [특징] : BFS는 현재 상태에서 가장 인접한 정점들을 우선적으로 탐색하는 방법입니다.
- [동작 방식] : BFS는 큐를 활용하여 구현 가능합니다.
- 큐
2. 현재 정점의 방문 순서 기록하기
- 입력받은 간선 정보를 2차원 벡터에 저장하고, 각 항목에 저장된 vector 컨테이너를 오름차순 정렬합니다.
- BFS를 수행하며 방문한 현재 정점의 방문 순서를 차례대로 저장합니다.
#3. 코드
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <queue>
#include <algorithm>
using namespace std;
int N, M, R;
// BFS 구현, 큐 활용
void BFS(int start, unordered_map<int, vector<int>>& graph, vector<int>& seq)
{
// 방문 여부
vector<bool> visited(N+1, false);
// 큐
queue<int> q;
// 방문 순서
int curSeq = 1;
// 시작 노드
visited[start] = true;
q.push(start);
while(!q.empty())
{
// 큐의 첫 번째 항목
int cur = q.front();
q.pop();
// 방문 순서 업데이트
seq[cur] = curSeq++;
for(int i=0; i<(int)graph[cur].size(); i++)
{
// 인접 정점
int neighbor = graph[cur][i];
// 방문 여부 체크
if(!visited[neighbor])
{
// 방문 순서 갱신
visited[neighbor] = true;
// 큐에 삽입
q.push(neighbor);
}
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> N >> M >> R;
// um 형식의 graph 선언
unordered_map<int, vector<int>> graph;
// 방문 순서
vector<int> seq(N+1, 0);
for(int i=0; i<M; ++i)
{
int node1, node2;
cin >> node1 >> node2;
graph[node1].push_back(node2);
graph[node2].push_back(node1);
}
// 오름차순 정렬
for(auto& edge : graph)
{
sort(begin(edge.second), end(edge.second));
}
// BFS 호출
BFS(R, graph, seq);
// 정답 출력
for(int i=1; i<(int)seq.size(); i++)
cout << seq[i] << '\n';
return 0;
}
'문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글
[BOJ알고리즘, C++]#1260_DFS와 BFS, DFS, BFS (0) | 2023.12.14 |
---|---|
[BOJ알고리즘, C++]#2606_바이러스, 그래프, DFS, BFS (0) | 2023.12.14 |
[BOJ알고리즘, C++]#24479_알고리즘 수업 - 깊이 우선 탐색 1, DFS, 재귀 DFS, 스택 DFS (0) | 2023.12.14 |
[BOJ알고리즘, C++]#5639_이진 검색 트리, 이진 탐색 트리 순회, 전위순회, 후위순회, 전위순회를 통해 후위순회 구하기 (0) | 2023.12.02 |
[BOJ알고리즘, C++]#2263_트리의 순회, 순회, 전위순회, 중위순회, 후위순회, 중위+후위를 통해 전위순회 구하기 (1) | 2023.12.02 |