개인사
[G5] 백준 34949번 이대로 가면 되나요? C++ BFS, 너비 우선 탐색 본문
728x90

리뷰

https://www.acmicpc.net/problem/34949
N번 노드에서 모든 노드까지의 거리를 구하는 문제
전역 변수
- N : 배열의 최대 크기를 정의할 상수 변수
- n : 노드의 개수를 저장할 변수
- dist : n번 노드에서 모든 노드까지의 거리를 저장할 배열
- edges : 간선 정보를 저장할 정수형 벡터 배열
함수
1. bfs
void bfs()
{
queue< int > q;
q.push( n );
dist[ n ] = 0;
while ( !q.empty() )
{
int cn = q.front(); q.pop();
for ( int nn : edges[ cn ] )
{
if ( dist[ nn ] != -1 )
continue;
dist[ nn ] = dist[ cn ] + 1;
q.push( nn );
}
}
}
너비 우선 탐색을 통해 n번 노드로부터 모든 노드로까지의 거리를 구해 dist를 초기화 하기 위한 함수
문제풀이
- n값을 입력 받고, memset함수를 통해 dist배열의 값을 -1로 초기화한다.
- n개 노드의 간선을 입력 받아 edges를 초기화한다.
- bfs함수를 통해 dist배열에 n번 노드에서 모든 노드로의 거리를 저장한다.
- 1번 노드부터 n번 노드까지 순회하며 dist에 저장된 값을 출력하고, 개행문자를 삽입하여 줄바꿈을 수행한다.
트러블 슈팅
없음
참고 사항
- 입력과 출력의 양이 많으므로 빠른 입출력을 권장한다.
- i번장소에서 Ai번장소로 이동하므로 단방향 간선을 추가해주었다.
- memset을 통해 초기값을 -1로 저장하여 방문 불가 지역에 대해 자동으로 -1을 적용해주었다.
정답 코드
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
const int N = 2e5 + 1;
int n;
int dist[ N ];
vector< int > edges[ N ];
void bfs()
{
queue< int > q;
q.push( n );
dist[ n ] = 0;
while ( !q.empty() )
{
int cn = q.front(); q.pop();
for ( int nn : edges[ cn ] )
{
if ( dist[ nn ] != -1 )
continue;
dist[ nn ] = dist[ cn ] + 1;
q.push( nn );
}
}
}
int main()
{
ios::sync_with_stdio( 0 );
cin.tie( 0 );
cout.tie( 0 );
cin >> n;
memset( dist, -1, sizeof( dist ) );
for ( int i = 1; i <= n; ++i )
{
int t; cin >> t;
edges[ t ].push_back( i );
}
bfs();
for ( int i = 1; i <= n; ++i )
cout << dist[ i ] << '\n';
}728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
| [G1] 백준 32644번 랜덤 넘버 추측하기 C++ 세그먼트 트리 (0) | 2026.03.22 |
|---|---|
| [G5] 백준 14588번 Line Friends (Small) C++ 플로이드 와샬, 최단 거리 (0) | 2026.03.19 |
| [G2] 백준 14907번 프로젝트 스케줄링 C++ 위상 정렬, 파싱, 해시맵 (0) | 2026.03.14 |
| [G5] 백준 30470번 호반우가 학교에 지각한 이유 3 C++ map, 트리맵, upper_bound (0) | 2026.03.10 |
| [G5] 백준 30702번 국기 색칠하기 C++ 너비 우선 탐색, 플러드 필 (0) | 2026.03.08 |
