코딩테스트/백준

[백준][C++]1260번 DFS와 BFS

윤깡패 2023. 6. 7. 20:15

문제

https://www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

 

 

풀이

DFS(깊이 우선 탐색)와 BFS(너비 우선 탐색) 알고리즘

 

DFS(깊이 우선 탐색)와 BFS(너비 우선 탐색) 알고리즘

탐색 알고리즘 주어진 데이터에서 자신이 원하는 데이터를 찾아내는 알고리즘 DFS(깊이 우선 탐색) 알고리즘 * DFS : Depth-First Search 그래프의 시작 노드에서 출발하여 탐색할 한쪽 분기를 정하여

soobin0821.tistory.com

 

 

코드

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

void DFS(int n);
void BFS(int n);
static vector<vector<int>> graph;
static vector<bool> visited;

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  int N, M, V;
  cin >> N >> M >> V;

  graph.resize(N + 1);
  visited.resize(N + 1);
  // 인접 리스트 graph에 그래프 데이터 저장
  for(int i = 0; i < M; i++)
  {
    int a, b;
    cin >> a >> b;
    graph[a].push_back(b);
    graph[b].push_back(a);
  }

  // 방문할 수 있는 노드가 여러 개일 때는 번호가 작은 것을 먼저 방문하기 위해 정렬
  for(int i = 1; i <= N; i++)
  {
    sort(graph[i].begin(), graph[i].end());
  }
  
  fill(visited.begin(), visited.end(), false);	// 방문 배열 초기화
  DFS(V);
  cout << "\n";
  fill(visited.begin(), visited.end(), false);
  BFS(V);
  
  return 0;
}

// DFS 구현
void DFS(int n)
{
  visited[n] = true;	// visited 배열에 현재 노드 방문 기록
  cout << n << " ";	// 현재 노드 출력
  
  // 현재 노드의 연결 노드 중 방문하지 않은 노드에 대해 DFS 실행
  for(int node : graph[n])
  {
    if(visited[node] == false)
    {
      DFS(node);
    }
  }
}

// BFS 구현
void BFS(int n)
{
  queue<int> myqueue;
  myqueue.push(n);	// 큐 자료구조에 시작 노드 넣기
  visited[n] = true;	// visited 배열에 현재 노드 방문 기록
  
  while(!myqueue.empty())
  {
    int now = myqueue.front();	// 큐에서 노드 데이터를 가져오기
    myqueue.pop();
    cout << now << " ";	// 가져온 노드 출력
    
    // 현재 노드의 연결 노드 중 방문하지 않은 노드에 대해 큐에 데이터를 삽입하고 visited 배열에 방문 기록
    for(int node : graph[now])
    {
      if(visited[node] == false)
      {
        myqueue.push(node);
        visited[node] = true;
      }
    }
  }
}

 

 

 

728x90