티스토리 뷰

728x90
반응형

문제 요약

  • 알고리즘 분류: dfs
  • 난이도:Silver2
  • 문제내용:
    • 깊이 우선 탐색후 각 노드 마다 방문 순서(내림차순)를 출력해라
 

24480번: 알고리즘 수업 - 깊이 우선 탐색 2

첫째 줄에 정점의 수 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 탐색 알고리즘에 관한 자세한 설명은 여기에서 확인 해보면 알 수 있다.

이번 문제는  아래 문제 사이트에 정렬을 오름차순에서 내림차순으로만 바꾸면 되기 때문에 따로 설명은 안하겠다.

https://jih3508.tistory.com/128

 

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

문제 요약 알고리즘 분류: 그리디, 정렬 난이도:Silver2 문제내용: 깊이 우선 탐색후 각 노드 마다 방문 순서를 출력해라 사이트: https://www.acmicpc.net/problem/24479 24479번: 알고리즘 수업 - 깊이 우선 탐

jih3508.tistory.com

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(reverse = True)

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), Collections.reverseOrder());
		}
		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
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함