컴퓨터기본/문제풀이

[백준] 1260번: DFS와 BFS

차가운오미자 2021. 11. 18. 16:15

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