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; }
반응형