백준 1260 DFS와 BFS
본문 바로가기
알고리즘 모음집/알고리즘 (Algorithm)

백준 1260 DFS와 BFS

by KyeongMin 2019. 9. 29.
728x90
반응형

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

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<stdio.h>
#include<iostream>
#include<queue>
#include<vector>
#include<string.h>
#include<algorithm>
#define NSIZE 1001
#define MSIZE 10001
using namespace std;
int N;
int M;
int S;
int chk[MSIZE];
vector<int>G[NSIZE];
 
void init() {
    scanf("%d %d %d"&N, &M, &S);
    for (int i = 0; i < N; i++) {
        G[i].clear();
    }
    for (int i = 0; i < M; i++) {
        int a, b;
        scanf("%d %d",&a,&b);
        G[a].push_back(b);
        G[b].push_back(a);
 
    }
}
void dfs(int c) {
    printf("%d ", c);
    for (int i = 0; i < G[c].size(); i++) {
        if (chk[G[c][i]] == 0) {
            chk[G[c][i]] = 1;
            dfs(G[c][i]);
        }
    }
}
void bfs() {
    queue<int> q;
    q.push(S);
    chk[S] = 1;
    while (!q.empty()) {
        int c = q.front(); q.pop();
        printf("%d ",c);
 
        for (int i = 0; i < G[c].size(); i++) {
            if (chk[G[c][i]] == 0) {
                chk[G[c][i]] = 1;
                q.push(G[c][i]);
            }
        }
    }
}
int main(void) {
    init();
    for (int i = 0; i < N; i++) {
        sort(G[i].begin(), G[i].end());
    }
    chk[S] = 1;
    dfs(S);
    memset(chk, 0sizeof(chk));
    cout << endl;
    bfs();
    return 0;
}
 
 

사실 이문제는 그래프를 구현할수 있나 없는가? 있는가? 입니다. 그래프를 구현해서 

dfs 와 bfs로 돌려보면 되는 문제입니다.

그래프에 대한 설명은 이론시간이 아니기때문에 생략하겠습니다. 무튼 그래프는 정점과 간선으로 이루어져있는데

파란색 글씨로 되어있는 동그라미 숫자는 각 정점이고 그뒤에 있는 숫자는 정점에서 갈수 있는 위치들 입니다.

그래프 구현은 백터하나 선언하고 이렇게 간단하게 구현할 수있습니다.  예전에 전체 구현하는게 힘들었는데 

stl은 정말 신세계 아닌지 ...

포인트 그래프를 구현한다. 그리고 dfs 와 bfs를 돌려만 주면서 출력한다. 그러면 끝입니다.

정말 쉽지 않나요? 나는 그래프를 모른다 하시는분은 저걸 기준으로 외워주셔도 되고 아니면 다른 사이트를 참고

해주세요.

 

 

 

728x90
반응형

댓글