묻공러
[C++ 자/알 Note] BFS 구현
묻공러
묻지마공부
묻공러
전체
오늘
어제
  • 분류 전체보기 (514) N
    • C (54)
      • [코드조선] C 핵심 (35)
      • [언어본색] C 기초 (19)
    • C++ (72)
      • [루키스] C++ (9)
      • [루키스] 콜백함수 (6)
      • [루키스] STL (8)
      • [루키스] Modern C++ (11)
      • [노코프] C++ (10)
      • [노코프] Tips (16)
      • [일지] C++ (12)
    • C# (15) N
      • [루키스] C# (9) N
      • [루키스] 자료구조 (3) N
      • [루키스] 실전 문법 (3) N
    • 자료구조 & 알고리즘 (50)
      • [코드조선] C 자료구조 & 알고리즘 (6)
      • [합격자되기] C++ 코딩테스트 (12)
      • [루키스] C++ 자료구조 & 알고리즘 (32)
    • CS (69)
      • [널널한 개발자] CS 개론 (19)
      • [혼자 공부하는] 컴퓨터 구조 (16)
      • [혼자 공부하는] 운영체제 (18)
      • [널널한 개발자] 네트워크 (16)
    • 게임 그래픽스 (46)
      • [전북대] OpenGL (25)
      • [일지] DirectX (21)
    • 게임 엔진 - 언리얼 (123)
      • [코드조선] 언리얼 (53)
      • [코드조선] 언리얼 데디서버 (8)
      • [일지] 언리얼 (59)
      • [일지] 언리얼 (2) (3)
    • 게임 엔진 - 유니티 (12) N
      • [최적화] 유니티 (4) N
      • [루키스] 유니티 (8) N
    • 게임 서버 (17)
    • 게임 수학 & 물리 (19)
      • 게임 수학 (12)
      • 게임 물리 (7)
    • GIT & GITHUB (4)
    • 영어 (18)
      • [The Outfit] 대본 공부 (11)
      • the others (7)
    • 그 외 (14)
      • In (5)
      • Out (5)
      • Review (4)

인기 글

최근 글

hELLO · Designed By 정상우.
자료구조 & 알고리즘/[루키스] C++ 자료구조 & 알고리즘

[C++ 자/알 Note] BFS 구현

2025. 1. 9. 11:44

주의사항

- "발견"이라는 개념

DFS는 방문의 개념을 이용했다

BFS는 발견의 개념을 이용한다

 

- 발견 큐

DFS의 핵심은 큐를 이용하는 것이다

발견한 정점들을 큐에 넣어주는 방식을 사용한다

 

- 발견 큐의 구조

일단 큐가 비어있기 때문에

시작 정점을 강제로 큐에 넣어주고 발견 여부를 true로 해주고 시작한다

 

이제 큐가 빌 때까지 큐를 실행하면 된다

큐에 들어있는 본인이 pop 되면서, 발견한 애들을 큐에 넣으면 된다

그리고 방문은 본인이 pop 되는 적절한 시점에 넣어주면 된다

 

- parent와 distance

본인을 발견한 parent를 저장하고 싶은 경우에는

큐에 push를 해주면서 발견여부를 true로 해줄 때

해당 큐를 발견한 정점을 넣어주면 된다

 

- distance

BFS 시작 지점으로부터 거리를 알고 싶은 경우에는

큐에 push를 해주면서 발견여부를 true로 해줄 때

해당 큐를 발견한 정점(부모)의 거리 + 1을 넣어주면 된다

 

BFS 구현

- 준비물

vector<Vertex> vertices;
vector<vector<int>> adjacent;
vector<bool> discovered;

 

1) 인접리스트 버전

- 그래프 생성

void CreateGraph_AdjacencyList()
{
	vertices.resize(6);
	adjacent = vector<vector<int>>(6);

	// 인접 리스트
	adjacent[0].push_back(1);
	adjacent[0].push_back(3);
	adjacent[1].push_back(0);
	adjacent[1].push_back(2);
	adjacent[1].push_back(3);
	adjacent[3].push_back(4);
	adjacent[5].push_back(4);
}

 

- BFS 한번 실행

void Bfs_AdjacencyList(int here)
{
	// 누구에 의해 발견 되었는지?
	vector<int> parent(6, -1);
	// 시작점에서 얼만큼 떨어져 있는지?
	vector<int> distance(6, -1);

	queue<int> q;
	q.push(here);
	discovered[here] = true;
	parent[here] = here;// parent를 위한 코드
	distance[here] = 0;// distance를 위한 코드

	while (q.empty() == false)
	{
		here = q.front();
		q.pop();

		cout << "Visited: " << here << " Parent: " << parent[here] << " Distance: " << distance[here] << endl;

		for (int i = 0; i < adjacent[here].size(); i++)// for (int there : adjacent[here])// 가능
		{
			int there = adjacent[here][i];

			if (discovered[there] == true)
				continue;

			q.push(there);
			discovered[there] = true;
			parent[there] = here;// parent를 위한 코드
			distance[there] = distance[here] + 1;// distance를 위한 코드
		}
	}
}

 

- BFS 모두 실행

void BfsAll_AdjacencyList()
{
	for (int i = 0; i < 6; i++)
		if (discovered[i] == false)
			Bfs_AdjacencyList(i);
}

 

- 실행

int main()
{
	CreateGraph_AdjacencyList();

	discovered = vector<bool>(6, false);

	//Bfs_AdjacencyList(0);
	BfsAll_AdjacencyList();
}

 

2) 인접행렬 버전

- 그래프 생성

void CreateGraph_AdjacencyMatrix()
{
	vertices.resize(6);
	adjacent = vector<vector<int>>(6);

	// 인접 행렬
	adjacent = vector<vector<int>>
	{
		{ 0, 1, 0, 1, 0, 0},
		{ 1, 0, 1, 1, 0, 0},
		{ 0, 0, 0, 0, 0, 0},
		{ 0, 0, 0, 0, 1, 0},
		{ 0, 0, 0, 0, 0, 0},
		{ 0, 0, 0, 0, 1, 0},
	};
}

 

- 나머지 부분

인접리스트와의 구현 차이가 있는 부분은

인접한 정점을 순회하는 경우에

연결되지 않은 정점을 걸러내는 부분만 사실상 추가된다

void Bfs_AdjacencyMatrix(int here)
{
	vector<int> parent(6, -1);
	vector<int> distance(6, -1);

	queue<int> q;
	q.push(here);
	discovered[here] = true;
	parent[here] = here;
	distance[here] = 0;

	while (q.empty() == false)
	{
		here = q.front();
		q.pop();

		cout << "Visited: " << here << " Parent: " << parent[here] << " Distance: " << distance[here] << endl;

		for (int i = 0; i < 6; i++)// 달라진 부분
		{
			if (adjacent[here][i] == 0)// 달라진 부분
				continue;

			if (discovered[i] == true)
				continue;

			q.push(i);
			discovered[i] = true;
			parent[i] = here;
			distance[i] = distance[here] + 1;
		}
	}
}
저작자표시 비영리 변경금지 (새창열림)

'자료구조 & 알고리즘 > [루키스] C++ 자료구조 & 알고리즘' 카테고리의 다른 글

[C++ 자/알 Note] 다익스트라 알고리즘  (0) 2025.01.10
[C++ 자/알 Note] BFS를 이용한 길찾기 구현  (0) 2025.01.10
[C++ 자/알 Note] DFS 구현  (0) 2025.01.09
[C++ 자/알 Note] 그래프  (0) 2025.01.09
[C++ 자/알 Note] 오른손 법칙 개선 (미로 탐색)  (0) 2025.01.08
'자료구조 & 알고리즘/[루키스] C++ 자료구조 & 알고리즘' 카테고리의 다른 글
  • [C++ 자/알 Note] 다익스트라 알고리즘
  • [C++ 자/알 Note] BFS를 이용한 길찾기 구현
  • [C++ 자/알 Note] DFS 구현
  • [C++ 자/알 Note] 그래프
묻공러
묻공러
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.