본문 바로가기

Algorithm

백준 1260번 DFS와 BFS 재풀이.

반응형

문제

그래프를 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