danbibibi
article thumbnail
Published 2022. 12. 2. 08:48
BOJ 1260번: DFS와 BFS 문제 풀이/백준

문제

문제 바로가기> BOJ 1260번: DFS와 BFS

 

1260번: DFS와 BFS

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

www.acmicpc.net

 

 

풀이

DFS와 BFS를 구현할 수 있는지를 보는 간단한 문제이다. 주의해야할 점은 "정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문"하기 때문에 미리 연결되는 node를 정렬해 두어야한다는 것이다!

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

int N, M, V;
bool visited[MAX];
vector<int> graph[MAX];

void input(){
    cin >> N >> M >> V;

    int a, b;
    for(int i=0; i<M; i++){
        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());
}

void dfs(int node){
    visited[node] = true;
    cout << node << " ";

    for(int i=0; i<graph[node].size(); i++){
        int next_node = graph[node][i];
        if(visited[next_node]) continue;
        dfs(next_node);
    }
}

void bfs(){
    for(int i=0; i<=N; i++) visited[i] = false;
    visited[V] = true;

    queue<int> q;
    q.push(V);

    while(!q.empty()){
        int node = q.front();
        cout << node << " ";
        q.pop();

        for(int i=0; i<graph[node].size(); i++){
            int next_node = graph[node][i];
            if(visited[next_node]) continue;
            visited[next_node] = true;
            q.push(next_node);
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    input();
    dfs(V);
    cout << "\n";
    bfs();
}

'문제 풀이 > 백준' 카테고리의 다른 글

BOJ 9465번: 스티커  (0) 2022.12.03
BOJ 2178번: 미로 탐색  (1) 2022.12.02
BOJ 15591번: MooTube (Silver)  (1) 2022.12.02
BOJ 2579번: 계단 오르기  (0) 2022.11.30
BOJ 12865번: 평범한 배낭  (0) 2022.11.29
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로