문제 : https://www.acmicpc.net/problem/19641
[ 문제 요약 ]
- 정점 개수와 각 정점에 연결된 다른 정점들이 주어질 때, 주어지는 루트 노드 번호부터 깊이 우선 탐색을 하여 방문하는 인덱스를 출력하는 문제입니다.
- 깊이 우선 탐색 시 방문할 노드가 여러 개라면 노드 번호가 작은 순으로 방문합니다.
[ 테스트 케이스 설명 ]
3// 정점 수 (2<=100,000)
2 1 3 -1 // 정점 번호가 먼저 주어지고, -1입력 전까지 해당 정점에 연결된 노드가 주어진다.
3 2 -1
1 2 -1
2// 루트노드 번호
출력 : 루트노드 부터 탐색을 시작하여 번호가 가장 낮은 노드부터 오름차순 방문해서 중첩 집합을 구성할 때, 각 노드의 번호 left 필드와 right 필드 출력
1 2 3// 정점 수 만큼 LEFT필드와 RIGHT필드를 출력
2 1 6
3 4 5
[ 알고리즘 분류 ]
- 그래프 이론
- 그래프 탐색
- 트리
- 깊이 우선 탐색
- 오일러 경로 테크닉
[ 문제 해설 ]
간단한 오일러 경로 테크닉 문제로 몇 가지만 신경 써주면 간단히 풀 수 있습니다.
인접 노드를 저장할 때 작은 노드부터 방문해야 하기 때문에 노드정보 저장 시마다 노드를 오름차순으로 정렬해 줍니다.
그 후 방문할 때 전역 변수를 하나 두고, in, out 시마다 고유번호로 마킹해주면 됩니다.
출력은 1번 노드부터 N 번 노드 순으로 출력해 주면 됩니다.
[ 정답 코드 ]
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
class Main{
static int N;
static int idx;
static int order[][];
static int adNode[][];
public static void main(String[] args)throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
order = new int[N + 1][2];
adNode = new int[N + 1][];
for(int i=0; i<N; i++)
{
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int len = st.countTokens() - 1;
adNode[a] = new int[len];
for(int j=0; j<len; j++)
adNode[a][j] = Integer.parseInt(st.nextToken());
Arrays.sort(adNode[a]);
}
dfs(Integer.parseInt(br.readLine()), 0);
StringBuilder sb = new StringBuilder();
for(int i=1; i<=N; i++)
sb.append(i).append(' ').append(order[i][0])
.append(' ').append(order[i][1]).append('\n');
System.out.print(sb);
}
static void dfs(int now, int parent)
{
order[now][0] = ++idx;
for(int next : adNode[now])
if(next != parent)
dfs(next, now);
order[now][1] = ++idx;
}
}
'알고리즘 > DFS(깊이우선탐색)' 카테고리의 다른 글
BOJ 백준 11266 단절점 (1) | 2025.07.28 |
---|