https://www.acmicpc.net/problem/1260
1260번: DFS와 BFS
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사
www.acmicpc.net
그냥 아주 간단하게 BFS 한 번, DFS 한 번 돌려주면 된다.
BFS를 돌릴 때 항상 visited 배열을 초기화하는 거랑 queue 초기화를 잊지 말자!
#include <stdio.h>
int N, M, V; // 노드, 간선, 시작 노드
int map[1000+5][1000+5];
int visited[1000 + 10];
void Get_Input(void) {
int s, e;
scanf("%d %d %d", &N, &M, &V);
for (int i = 0; i < M; i++) {
scanf("%d %d", &s, &e);
map[s][e] = 1;
map[e][s] = 1;
}
}
int q[1000 * 1000 + 50];
int wp, rp;
void enq(int node) { q[wp++] = node; }
int deq(void) { return q[rp++]; }
int empty(void) { return rp == wp; }
void BFS(int s) {
memset(visited, 0, sizeof(visited));
visited[s] = 1;
enq(s);
while (!empty()) {
int cur = deq();
for (int i = 1; i <= N; i++) {
if (map[cur][i] == 0) continue;
if (visited[i] == 1)continue;
visited[i] = 1;
enq(i);
}
}
}
void DFS(int s) {
printf("%d ", s);
visited[s] = 1;
for (int i = 1; i <= N; i++) {
if (map[s][i] == 0) continue;
if (visited[i] == 1)continue;
DFS(i);
}
}
int main(void) {
freopen("in.txt", "r", stdin);
Get_Input();
DFS(V);
printf("\n");
BFS(V);
for (int i = 0; i < wp; i++) { printf("%d ", q[i]); }
return 0;
}
'컴퓨터기본 > 문제풀이' 카테고리의 다른 글
[백준] 7569번: 토마토 (0) | 2021.11.18 |
---|---|
[백준] 2933번: 미네랄 (0) | 2021.11.18 |
[백준] 13458번: 시험 감독 (0) | 2021.11.18 |
[SWEA] 2382. 미생물 격리 (0) | 2021.10.10 |
[SWEA] 5644. 무선 충전 (0) | 2021.10.09 |