그래프
[백준] 1260. DFS와 BFS
hch06
2025. 2. 4. 15:04
https://www.acmicpc.net/problem/1260
깊이 우선 탐색(DFS)과 넓이 우선 탐색(BFS)를 구현해보는 간단한 예제이다.
깊이 우선 탐색은 재귀 함수를 이용하여서 탐색하고, 넓이 우선 탐색은 자료 구조 중 하나인 큐를 이용해서 탐색한다.
C언어로 풀 때에는 구조체를 이용해 큐를 구현하였다.
C
더보기
#include <stdio.h>
#define MaxSize 1000000
int edge1[1001][10001];
int edge2[1001][10001];
int check1[1001];
int check2[1001];
// Queue
typedef struct{
int data[100000];
int len;
int front;
int rear;
} Queue;
void initQueue(Queue* q){
q->len = 0;
q->front = 0;
q->rear = 0;
}
int popleft(Queue* q){
if(q->len > 0){
int res = q->data[q->front];
q->front += 1;
q->len -= 1;
if(q->front == MaxSize) q->front = 0;
return res;
}
}
void append(Queue* q, int v){
int idx = q->rear;
q->data[idx] = v;
q->rear += 1;
q->len += 1;
if(q->rear == MaxSize) q->rear = 0;
}
// edge 관련 함수들
int edgeLen(int num, int idx){
int cnt = 0;
for(int i = 0; i < 10001; i++){
if(num == 1 && edge1[idx][i] == 0) break;
else if(num == 2 && edge2[idx][i] == 0) break;
if(num == 1 && edge1[idx][i] != -1) cnt++;
else if(num == 2 && edge2[idx][i] != -1) cnt++;
}
return cnt;
}
int edgeMin(int num, int idx){
int min = 100000;
for(int i = 0; i < 10001; i++){
if(edge1[idx][i] != -1){
if(num == 1 && edge1[idx][i] == 0) break;
if(num == 1 && edge1[idx][i] < min) min = edge1[idx][i];
}
if(edge2[idx][i] != -1){
if(num == 2 && edge2[idx][i] == 0) break;
if(num == 2 && edge2[idx][i] < min) min = edge2[idx][i];
}
}
return min;
}
int edgeIndex(int num, int index, int v){ // edge[index] 중에서 v값 찾은 후 몇번째에 있는지 반환
for(int i = 0; i < 10001; i++){
if(num == 1 && edge1[index][i] == 0) break;
if(num == 1 && edge1[index][i] == v) return i;
if(num == 2 && edge2[index][i] == 0) break;
if(num == 2 && edge2[index][i] == v) return i;
}
return -1;
}
void DFS(int v){
check1[v] = 1;
printf("%d ", v);
int l = edgeLen(1, v);
while(edgeLen(1, v) > 0){
if(check1[edgeMin(1, v)] == 0) DFS(edgeMin(1, v));
edge1[v][edgeIndex(1, v, edgeMin(1, v))] = -1;
}
}
void BFS(int v){
Queue q;
initQueue(&q);
check2[v] = 1;
append(&q, v);
while(q.len > 0){
int a = popleft(&q);
printf("%d ", a);
while(edgeLen(2, a) > 0){
int min = edgeMin(2, a);
if(check2[min] == 0){append(&q, min); check2[min] = 1;}
edge2[a][edgeIndex(2, a, min)] = -1;
}
}
}
int main() {
int n, m, v; scanf("%d %d %d", &n, &m, &v);
for(int i = 0; i < m; i++){ // 입력
int a, b;
scanf("%d %d", &a, &b);
for(int j = 0; j < 10001; j++)
if(edge1[a][j] == 0) {edge1[a][j] = b; edge2[a][j] = b; break;}
for(int j = 0; j < 10001; j++)
if(edge1[b][j] == 0) {edge1[b][j] = a; edge2[b][j] = a; break;}
}
DFS(v);
printf("\n");
BFS(v);
}
Python
더보기
from collections import deque
import copy
import sys
sys.setrecursionlimit(10 ** 6)
def BFS(v):
q = deque()
q.append(v)
check[v] = True
while len(q) > 0:
a = q.popleft()
print(a, end=" ")
while len(edge[a]) > 0:
if check[min(edge[a])] == False:
q.append(min(edge[a]))
check[min(edge[a])] = True
del edge[a][edge[a].index(min(edge[a]))]
def DFS(v):
check[v] = True
print(v, end=" ")
l = len(edge[v])
while len(edge[v]) > 0:
if check[min(edge[v])] == False:
DFS(min(edge[v]))
del edge[v][edge[v].index(min(edge[v]))]
n, m, v = map(int, input().split())
edge = [[] for _ in range(n+1)]
for i in range(m):
a, b = map(int, input().split())
edge[a].append(b)
edge[b].append(a)
# print(edge)
t = copy.deepcopy(edge)
check = [False for _ in range(n+1)]
DFS(v)
print()
edge = copy.deepcopy(t)
check = [False for _ in range(n+1)]
# print(edge)
BFS(v)