펭로그

[C++] 백준 BOJ 1260 DFS와 BFS 본문

Study/PS(Algorithm)

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

노랑펭귄 2018. 7. 31. 22:13

문제링크 : https://boj.kr/1260


가장 기본적인 DFS, BFS 문제이다.

시간초과 때문에 애먹었었는데.. 백준 사이트 자체 채점 시스템은 제약조건이 너무 많은 것 같다.

std::cin과 같은 것도 조심해야 하고 for each 구문도 조심해야 하는듯....

편하려고 STL을 사용하면 문제 생기는 부분이 좀 있는 것 같다.



1
2
3
4
5
6
7
8
9
10
11
void dfs(int num){
    if(!visited[num])
        sort(node[num].begin(), node[num].end());
    visited[num] = true;
    for(int i : node[num]) {
        if (!visited[i]) {
            cout << i << " ";
            dfs(i);
        }
    }
}
cs


처음에 이런 식으로 for(int i : node[num]) 로 작성했더니 시간초과가 나왔다.
sort의 문제인가 다른 최적화의 문제인가 고민하다가 일반 문장으로 바꾸니 해결되었다.



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
66
67
68
// BOJ 1260 DFS와 BFS
#include <bits/stdc++.h>
 
using namespace std;
 
vector<int> node[1001]; // 그래프
bool visited[1001];     // 방문 체크
queue<int> qq;         // BFS용 큐
 
void dfs(int num){
    if(!visited[num])
        sort(node[num].begin(), node[num].end());
    visited[num] = true;
    for(int i = 0; i < node[num].size(); i++) {
        int a = node[num][i];
        if (!visited[a]) {
            cout << a << " ";
            dfs(a);
        }
    }
}
 
void bfs(int num){
    qq.push(num); visited[num] = true// 첫항
    while(!qq.empty()){
        int nn = qq.front();
        qq.pop(); // poll
        if(!visited[nn])
            sort(node[nn].begin(), node[nn].end());
        for(int i = 0; i < node[nn].size(); i++){
            int a = node[nn][i];
            if(!visited[a]) {
                visited[a] = true;
                cout << a << " ";
                qq.push(a);
            }
        }
    }
}
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    // freopen("../input.txt", "r", stdin);
 
    // 입력
    int num, edg, ptr;
    cin >> num >> edg >> ptr;
    int a, b;
    for(int i = 0; i < edg; i++){
        cin >> a >> b;
        // 양방향 그래프 만들기
        node[a].push_back(b);
        node[b].push_back(a);
    }
 
    memset(visited, falsesizeof(visited));
    cout << ptr << " ";
    dfs(ptr);
    cout << "\n";
 
    memset(visited, falsesizeof(visited));
    cout << ptr << " ";
    bfs(ptr);
 
    return 0;
}
cs


Comments