그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
DFS같은 경우는 다음 노드에 마크를 남기면서 다음 노드 위치에서 재귀호출을 하는 방식으로 진행하면 결국 마크가 없는 노드가 존재 하지않을 때까지 진행후 돌아오기 때문에 뭐 back tracking = DFS이므로 그런 방식으로 진행되고,
BFS같은 경우는 코드가 살짝 조잡해 보이는 면이 있지만, 우선 한 노드에서 연결된 노드들을 전부 출력 한 뒤
현재 노드에서 연결된 노드 중 가장 작은 위치값을 갖는 노드를 기억하게 해서, 다음 위치를 그 노드로 잡는다.
물론 출력은 마크가 새겨지지 않은 노드에 한해서 하므로 함수가 무한반복 하거나 하는일은 발생하지 않는다.
#include <iostream>
using namespace std;
int N,F,V;
int tree[1001][1001];
int visit[1001];
int visitb[1001];
void DFS(int v)
{
cout<<v<<" ";
for(int i=1; i<=N; i++)
{
if(tree[v][i]==1 &&!visit[i])
{
visit[i]=1;
DFS(i);
}
}
}
void BFS(int v)
{ int k;
if(!visitb[v]){
cout<<v<<" ";
visitb[v]=1;
}
int min =1000;
for(int i=1; i<=N; i++)
{
if(tree[v][i]==1 &&!visitb[i])
{
cout<<i<<" ";
visitb[i]=1;
if(i<min){
min=i;
}
}
}
if(min!=1000)
{
BFS(min);
}
}
int main(void)
{
int Start,End;
cin>>N>>F>>V;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
{
tree[i][j]=0;
}
for(int i=0;i<F;i++)
{
cin>>Start>>End;
tree[Start][End]=1;
tree[End][Start]=1;
}
visit[V]=1;
DFS(V);
cout<<endl;
BFS(V);
}
'Algorithm' 카테고리의 다른 글
백준 11279 최대힙 (0) | 2019.07.10 |
---|---|
백준 16397 탈출 (0) | 2019.07.09 |
백준 10545 뚜기뚜기메뚜기 (0) | 2019.07.03 |
백준 5622번 다이얼 (0) | 2019.07.03 |
백준 2562번 최대값 (0) | 2019.07.02 |