728x90
반응형
기본적인 DFS, BFS 문제였다.
DFS는 재귀함수를 사용해서, BFS는 queue를 사용해서 구현했다.
알고리즘
DFS
- 재귀함수로 start를 매개변수로 넣어 호출한다.
- 인자로 들어온 start를 방문했음을 bool 배열에서 체크해준다.
- 1부터 정점의 수까지 방문하지 않았고, 인접한 정점을 재귀함수로 호출해준다.
void DFS(int start)
{
visited[start] = true;
cout << start << " ";
for (int i = 1; i <= cnt; i++)
{
// 방문하지 않았고 인접한 정점
if (arr[start][i] && !visited[i])
{
DFS(i);
}
}
}
BFS
- 함수로 들어온 start를 queue에 넣고, 방문했음을 bool형 배열에서 체크해준다.
- queue에 top과 인접하고 방문하지 않은 정점을 모두 queue에 넣어주고 pop한다.
- 2 과정을 queue가 빌 때까지 반복한다.
void BFS(int start)
{
queue<int> q;
q.push(start);
visited[start] = true;
while(!q.empty())
{
int x = q.front();
q.pop();
cout << x << " ";
for (int i = 1; i <= cnt; i++)
{
// 방문하지 않았고 인접한 정점
if (arr[x][i] && !visited[i])
{
visited[i] = true;
q.push(i);
}
}
}
}
전체 코드를 보자.
#include<bits/stdc++.h>
using namespace std;
bool arr[1001][1001];
bool visited[1001];
void DFS(int start);
void BFS(int start);
int cnt, len, start;
int main()
{
cin >> cnt >> len >> start;
while (len--)
{
int num1, num2;
cin >> num1 >> num2;
arr[num1][num2] = arr[num2][num1] = 1;
}
DFS(start);
cout << endl;
// 초기화
fill_n(visited, 1001, false);
BFS(start);
}
void DFS(int start)
{
visited[start] = true;
cout << start << " ";
for (int i = 1; i <= cnt; i++)
{
// 방문하지 않았고 인접한 정점
if (arr[start][i] && !visited[i])
{
DFS(i);
}
}
}
void BFS(int start)
{
queue<int> q;
q.push(start);
visited[start] = true;
while(!q.empty())
{
int x = q.front();
q.pop();
cout << x << " ";
for (int i = 1; i <= cnt; i++)
{
// 방문하지 않았고 인접한 정점
if (arr[x][i] && !visited[i])
{
visited[i] = true;
q.push(i);
}
}
}
}
기본에 맞게 구현한 것 같다. 그래프 탐색은 항상 재미있다!
728x90
반응형
'알고리즘 문제풀이 > 그래프 탐색' 카테고리의 다른 글
[백준][C++] 2667 단지번호붙이기 (0) | 2022.11.03 |
---|---|
[백준][C++] 1325 효율적인 해킹 (0) | 2022.11.03 |
[백준][C++] 2606 바이러스 (0) | 2022.11.03 |
[백준][C++] 6497 전력난 (0) | 2022.11.03 |
[백준][C++] 14621 나만 안되는 연애 (0) | 2022.11.03 |