๐ ๋ฌธ์
https://www.acmicpc.net/problem/11725
๋ฌธ์
๋ฃจํธ ์๋ ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋, ํธ๋ฆฌ์ ๋ฃจํธ๋ฅผ 1์ด๋ผ๊ณ ์ ํ์ ๋, ๊ฐ ๋ ธ๋์ ๋ถ๋ชจ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ ธ๋์ ๊ฐ์ N (2 ≤ N ≤ 100,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N-1๊ฐ์ ์ค์ ํธ๋ฆฌ ์์์ ์ฐ๊ฒฐ๋ ๋ ์ ์ ์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค๋ถํฐ N-1๊ฐ์ ์ค์ ๊ฐ ๋ ธ๋์ ๋ถ๋ชจ ๋ ธ๋ ๋ฒํธ๋ฅผ 2๋ฒ ๋ ธ๋๋ถํฐ ์์๋๋ก ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
๊ฐ ๋ ธ๋์ ๋ถ๋ชจ๋ผ๋ ๊ฒ์ด Union-Find์์ ์ฐพ๋ ๋ถ๋ชจ๊ฐ ์๋๊ณ , ๋ฐ๋ก ์์ ์ฐ๊ฒฐ๋์ด์๋ ๋ ธ๋๋ผ๋ ๊ฒ์ ๋ปํ๋ค.
1๋ฒ ๋ ธ๋๊ฐ ํธ๋ฆฌ์ ๋ฃจํธ๋ผ๊ณ ํ์์ผ๋ฏ๋ก, 1๋ฒ ๋ ธ๋๋ฅผ ๋ถ๋ชจ๋ก ๊ฐ๋ ๋ ธ๋๋ค์ ๋ฐ๋ก ์๋ ์ฐ๊ฒฐ๋์ด ์๋ ๋ ธ๋๋ค์ด๋ค.
DFS๋ก 1๋ฒ ๋ ธ๋๋ถํฐ ํด์ ์๋๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๋ ธ๋๋ค์ ์ญ ํ์ํ๋ฉด ๋๋ค!
ํน์ ๋ ธ๋์ ๋ํ DFS ํ์์์ ์๋๋ก ์ฐ๊ฒฐ๋์ด์๊ณ ์์ง ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๊ฐ ๋์ง ์์ ๋ ธ๋๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์์๋ ธ๋๋ก ์ฒ๋ฆฌํ ํ ์์๋ ธ๋์ ๋ํ ์์์ ์ฐพ๊ธฐ ์ํด ์ฌ๊ท๋ก DFS๋ฅผ ๋ค์ ํธ์ถํ๋ค.
โป๏ธ int[] parents[N+1]: 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๊ฐ ๋ ธ๋์ ๋ถ๋ชจ๋ ธ๋๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด
โป๏ธ ArrayList<int>[N+1] list: ๊ฐ ๋ ธ๋๋ณ๋ก ์ฐ๊ฒฐ๋์ด์๋ ๋ ธ๋๋ค์ ์ ์ฅํ ArrayList์ ๋ฐฐ์ด
โป๏ธ visited[N+1]: ํน์ ๋ฒํธ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ํ ๋ฐฐ์ด
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
import java.awt.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
//DFS
public class Main_๋ฐฑ์ค_11725_ํธ๋ฆฌ์๋ถ๋ชจ์ฐพ๊ธฐ_์ค๋ฒ2 {
static int N;
static int[] parents;
static boolean[] visited;
static ArrayList<Integer>[] list;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
N = Integer.parseInt(br.readLine());
parents = new int[N+1];
visited = new boolean[N+1];
list = new ArrayList[N+1];
for (int i = 1; i <= N; i++) {
list[i] = new ArrayList<Integer>();
}
for (int i = 0; i < N-1; i++) {
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
list[v1].add(v2);
list[v2].add(v1);
}//input
dfs(1);
//print
for (int i = 2; i <= N; i++) {
System.out.println(parents[i]);
}
}//end of main
private static void dfs(int v) {
visited[v]=true;
for(int vertex: list[v]) {
if(!visited[vertex]) {
parents[vertex]=v;
dfs(vertex);
}
}
}//end of dfs
}//end of class
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ