문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
DFS는 무조건 재귀 , for문을 통해 값을 변화 시키면서 반복 호출이 기본 포맷
->stack사용 무리하게 하면 순서 꼬이니 주의!
다음 단계에 가서 그 다음에 뭘 진행 할지 생각 하는 느낌으로 풀기!
BFS는 무조건 queue를 사용 할 것! 간단하게 해결 가능.
#include <iostream>
#include <queue>
using namespace std;
int N,M,S;
int arr[1001][1001];
bool visitd[1001];
bool visitb[1001];
void DFS(int start)
{
cout << start <<" ";
visitd[start] = true;
for(int i = 1; i<=1000; i++)
{
if(arr[start][i]==1 && !visitd[i])
{
visitd[i] = true;
DFS(i);
}
}
}
void BFS(int start)
{
queue que;
que.push(start);
visitb[start]= true;
cout<<start<<" ";
while(!que.empty())
{
int current = que.front();
que.pop();
for(int i = 1; i<= 1000; i++ )
{
if(arr[current][i] && !visitb[i] )
{
que.push(i);
cout<<i<<" ";
visitb[i] = true;
}
}
}
}
int main(void)
{
cin >> N >> M >> S;
for(int i = 0; i<M; i++)
{
int a,b;
cin >> a >> b;
arr[a][b] = 1;
arr[b][a] = 1;
}
DFS(S);
cout<<endl;
BFS(S);
}
'Algorithm' 카테고리의 다른 글
백준 2014번 소수의 곱 (0) | 2019.10.13 |
---|---|
백준 11403번 경로찾기 (0) | 2019.10.10 |
백준 6603번 로또 (0) | 2019.10.07 |
백준 1718번 암호 (0) | 2019.09.30 |
백준 2897번 몬스터 트럭 (0) | 2019.09.30 |