본문 바로가기
알고리즘/백준

[BAEKJOON]24479 알고리즘 수업 - 깊이 우선 탐색 1

by 응애~ 개발자 2023. 1. 30.
728x90
반응형

문제 요약

  • 알고리즘 분류: 그리디, 정렬
  • 난이도:Silver2
  • 문제내용:
    • 깊이 우선 탐색후 각 노드 마다 방문 순서를 출력해라
 

24479번: 알고리즘 수업 - 깊이 우선 탐색 1

첫째 줄에 정점의 수 N (5 ≤ N ≤ 100,000), 간선의 수 M (1 ≤ M ≤ 200,000), 시작 정점 R (1 ≤ R ≤ N)이 주어진다. 다음 M개 줄에 간선 정보 u v가 주어지며 정점 u와 정점 v의 가중치 1인 양

www.acmicpc.net

문제풀이

 이번 문제는 DFS 탐색 문제이다.  DFS 탐색 알고리즘에 관한 자세한 설명은 여기에서 확인 해보면 알 수 있다.

이번문제는 그래프 구조를 만든후 각 노드 마다 연결 되는 노드를 오름차순으로 정렬 후에 탐색 구현 하면된다.

구현 위 코드에 탐색 할때 마다 카운터 증가해서 방문한 노드에 방문순서를 기입만 하면 되서 따로 설명은 안하겠다.

 

Code

Python

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**9)

def dfs(n):
    global count
    visited[n] = count
    count += 1
    for node in grape[n]:
        if visited[node] == 0:
            dfs(node)

N, M, start = map(int, input().split())
grape = {i : [] for i in range(1, N + 1)}

for _ in range(M):
    a, b = map(int, input().split())
    grape[a].append(b)
    grape[b].append(a)

visited = [0] * (N + 1)

for i in range(1, N + 1):
    grape[i].sort()

count = 1
dfs(start)
print('\n'.join(map(str, visited[1:])))

Java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
	
	static Map<Integer, ArrayList<Integer>> grape = new HashMap<Integer, ArrayList<Integer>>();
	static int N;
	static int[] visited;
	static int count = 1;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = Integer.parseInt(st.nextToken());
		int M = Integer.parseInt(st.nextToken());
		int start = Integer.parseInt(st.nextToken());
		
		for(int i = 1; i <= N; i++) {
			grape.put(i, new ArrayList<Integer>());
		}
		visited = new int[N + 1];
		
		int a, b;
		for(int i = 1; i <= M; i++) {
			st = new StringTokenizer(br.readLine());
			a = Integer.parseInt(st.nextToken());
			b = Integer.parseInt(st.nextToken());
			grape.get(a).add(b);
			grape.get(b).add(a);
		}
		
		for(int i = 1; i <= N; i++) {
			Collections.sort(grape.get(i));
		}
		dfs(start);
		StringBuilder sb = new StringBuilder();
		for(int i = 1; i <= N; i++) {
			sb.append(visited[i]).append("\n");
		}
		System.out.println(sb);
		
	}
	
	public static void dfs(int node) {
		visited[node] = count;
		count++;
		for(int n : grape.get(node)) {
			if (visited[n] == 0) {
				visited[n] = visited[node] + 1;
				dfs(n);
			}
		}
	}

}
728x90
반응형