기술 블로그

1260번 DFS와 BFS 본문

알고리즘 문제/BOJ

1260번 DFS와 BFS

parkit 2018. 8. 21. 19:03
728x90
반응형

C언어의 행렬과 C++의 vector로 구현한 DFS와 BFS 문제이다.  


나중에 C언어의 연결리스트로 구현한 코드도 업로드 하겠다.


특히, 이러한 Skill의 경우 각종 응용 문제에서 많이 활용되니 꼭 기억해두자. 



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




C언어 행렬

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
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int N = 0, M = 0, V = 0;
 
int Graph[1001][1001= { 0, };
 
int visit[1001= { 0, };
 
int queue[1001= { 0, };
 
void DFS(int start)
{
    printf("%d ", start);
 
    visit[start] = 1;
 
    for (int i = 1; i <= N; i++)
    {
        if (Graph[start][i] == 1 && visit[i] == 0)
        {
            DFS(i);
        }
    }
}
 
void BFS(int start)
{
    int front = 0, rear = 0pop = 0;
 
    printf("%d ", start);
    
    visit[start] = 1;
 
    queue[rear++= start;
 
    while (front < rear)
    {
        pop = queue[front++];
 
        for (int i = 1; i <= N; i++)
        {
            if (Graph[pop][i] == 1 && visit[i] == 0)
            {
                printf("%d ", i);
 
                queue[rear++= i;
                visit[i] = 1;
            }
        }
    }
}
 
int main(void)
{
    int from = 0, to = 0;
 
    memset(visit, 0sizeof(visit));
    memset(Graph, 0sizeof(Graph));
 
    scanf("%d %d %d"&N, &M, &V);
 
    for (int i = 0; i < M; i++)
    {
        scanf("%d %d"&from, &to);
 
        Graph[from][to] = 1;
        Graph[to][from] = 1;
    }
 
    DFS(V);
    printf("\n");
 
    memset(visit, 0sizeof(visit));
 
    BFS(V);
    printf("\n");
 
    return 0;
}
cs






C++ vector

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
 
using namespace std;
 
int N = 0// 정점의 개수
 
int M = 0// 간선의 개수
 
int V = 0// 탐색을 시작할 정점의 번호
 
vector<vector<int> > adj; // 인접 리스트
 
queue<int> q;
 
int visit[1001= { 0, };
 
void Add_adj(int s, int e) // 간성 생성
{
    adj[s].push_back(e);
    adj[e].push_back(s);
}
 
void Sort_adj() // 정렬
{
    for (int i = 1; i <= N; i++)
    {
        sort(adj[i].begin(), adj[i].end());
    }
}
 
void DFS(int start) // 깊이 우선 탐색
{
    printf("%d ", start); // 출력
 
    visit[start] = 1;
 
    for (int next : adj[start])
    {
        if(visit[next] == 0) DFS(next);
    }
 
    /*for (int i = 0; i< adj[start].size(); i++)
    {
        int next = adj[start][i];
        if (visit[next] == 0) DFS(next);
    }*/
}
 
void BFS(int start) // 너비 우선 탐색
{
    q.push(start);
 
    while (!q.empty())
    {
        int qSize = q.size();
 
        for (int i = 0; i < qSize; i++)
        {
            int here = q.front();
 
            q.pop();
 
            if (visit[here] == 1continue// 1이면 무시(방문했다는 뜻)
 
            visit[here] = 1// 방문 
 
            printf("%d ", here);
             
            for (int i = 0; i < adj[here].size(); i++)
            {
                q.push(adj[here][i]);
            }
        }
    }
     
    /*
    while (N>0)
    {
      for (int next : adj[start])
      {
          if (visit[next] == 0) // 방문 하지 않았다면,
          {
              printf("%d ", next);
 
              visit[next] = 1; // 방문처리 해주고
 
              q.push(next); // 큐에 담는다.
          }
      }
 
      if (!q.empty())
      {
          start = q.front();
          q.pop();
      }
 
      --N;
    }
    */
}
 
int main(void)
{
    int vs = 0, ve = 0;
 
    scanf("%d %d %d"&N, &M, &V);
 
    adj.resize(N + 1);
 
    for (int i = 1; i <= M; i++)
    {
        scanf("%d %d"&vs, &ve);
 
        Add_adj(vs, ve);
    }
     
    Sort_adj();
 
    DFS(V);
 
    memset(visit, 0sizeof(visit));
 
    printf("\n");
 
    BFS(V);
 
    printf("\n");
 
    return 0;
}
cs


728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

11053번 가장 긴 증가하는 부분 수열  (0) 2018.08.22
7562번 나이트의 이동  (0) 2018.08.22
2206번 벽 부수고 이동하기  (0) 2018.08.21
10989번 수 정렬하기 3  (0) 2018.08.21
13460번 구슬 탈출 2  (0) 2018.08.21