[백준 / C언어] 1260번: DFS와 BFS

728x90
728x90

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

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

난이도: solved.ac 실버 2

 

 

DFS와 BFS를 구현하는 문제다

 

graph라는 2차원 배열을 통해 각 정점끼리 연결된 것을 표현하고

 

각 정점을 방문하면 visited라는 배열의 해당 index 값을 1로 바꿔주었다

 

그리고 BFS 한정으로 큐(Queue)를 사용했는데

 

front와 rear라는 변수를 통해 enqueue, dequeue할 때의 위치를 나타내었다

 

#include<stdio.h>
#include<string.h>
#define MAX 1001

int graph[MAX][MAX];
int visited[MAX];
int queue[MAX];

void DFS(int N, int V);
void BFS(int N, int V);

int main() {
	int N, M, V;
	scanf("%d %d %d", &N, &M, &V);

	int x, y, i, j;
	for (i = 0; i < M; i++) {
		scanf("%d %d", &x, &y);
		graph[x][y] = 1;
		graph[y][x] = 1;
	}

	DFS(N, V);
	printf("\n");
	memset(visited, 0, sizeof(int) * (N + 1));
	BFS(N, V);
	return 0;
}

void DFS(int N, int V) {
	visited[V] = 1;
	printf("%d ", V);
	for (int i = 1; i <= N; i++) {
		if (visited[i] == 0 && graph[V][i]) {
			DFS(N, i);
		}
	}
	return;
}

void BFS(int N, int V) {
	int front = -1, rear = -1, pop;
	printf("%d ", V);
	visited[V] = 1;
	queue[++rear] = V;

	while (front < rear) {
		pop = queue[++front];
		for (int i = 1; i <= N; i++) {
			if (visited[i] == 0 && graph[pop][i]) {
				printf("%d ", i);
				visited[i] = 1;
				queue[++rear] = i;
			}
		}
	}
	return;
}
반응형