백준 1260번 : DFS와 BFS / C++

2023. 3. 14. 16:31개인공부/코딩테스트

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
66
67
68
69
 
#include <iostream>
#include <set>
#include <queue>
using namespace std;
 
int N, M, V;
 
set<int>* arr[1001]{};
bool DFSvisit[1001]{};
bool BFSvisit[1001]{};
 
void DFS(int index)
{
    cout << index << ' ';
    DFSvisit[index] = true;
 
    for (auto iter = arr[index]->begin(); iter != arr[index]->end(); ++iter)
    {
        if (DFSvisit[*iter] == false)
            DFS(*iter);
    }
}
 
void BFS(int index)
{
    queue<int> q;
    q.push(index);
    BFSvisit[index] = true;
    cout << index << ' ';
 
    while (!q.empty())
    {
        int f = q.front();
        for (auto iter = arr[f]->begin(); iter != arr[f]->end(); ++iter)
        {
            if (BFSvisit[*iter] == false)
            {
                q.push(*iter);
                BFSvisit[*iter] = true;
                cout << *iter << ' ';
            }
        }
        q.pop();
    }
}
 
int main(void)
{
    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    cin >> N >> M >> V;
    for (int i = 1; i <= N; ++i)
        arr[i] = new set<int>;
 
    for (int i = 0; i < M; ++i)
    {
        int x1, x2;
        cin >> x1 >> x2;
        arr[x1]->insert(x2);
        arr[x2]->insert(x1);
    }
 
    DFS(V);
    cout << '\n';
    BFS(V);
}
cs