๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1167
๐ ๋ฌธ์ ์์ฝ
- ํธ๋ฆฌ์ ์ง๋ฆ: ํธ๋ฆฌ์์ ๊ฐ์ฅ ๊ธด ๊ฒฝ๋ก์ ๊ธธ์ด.
- ์ ์ ์ด ์์๋๋ก ์ฃผ์ด์ง๋ค๋ ๋ณด์ฅ์ด ์์.
- DFS 2๋ฒ ์ฌ์ฉํ์ฌ ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํจ:
- ์์์ ์ ์ ์์ ๊ฐ์ฅ ๋จผ ์ ์ ์ ์ฐพ์.
- ์ด ์ ์ ์์ ๊ฐ์ฅ ๋จผ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ํธ๋ฆฌ์ ์ง๋ฆ.
๐ ํ์ด ๋ฐ ์๊ณ ๋ฆฌ์ฆ
- ๊ทธ๋ํ ์
๋ ฅ์ ์ธ์ ๋ฆฌ์คํธ๋ก ์ ์ฅ
- ์ ์ ์ ๊ฐ์(v)๋ฅผ ์ ๋ ฅ๋ฐ๊ณ , ๊ฐ ์ ์ ์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด๋ฅผ ์ ์ฅ.
- ์ ๋ ฅ์ด ์์๋๋ก ์ฃผ์ด์ง์ง ์๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ฆฌ์คํธ ํ์ฉ.
- DFS 1ํ ์คํ
- ์์์ ์ ์ ์์ ๊ฐ์ฅ ๋จผ ์ ์ (maxNode)์ ์ฐพ์.
- visited[] ๋ฐฐ์ด์ ํ์ฉํ์ฌ ํ์.
- DFS 2ํ ์คํ
- maxNode์์ ๊ฐ์ฅ ๋จผ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ(temp)๋ฅผ ๊ตฌํจ → ํธ๋ฆฌ์ ์ง๋ฆ.
๐ก ์ฝ๋
public class Baekjoon_1167 {
static int v, maxLen, maxNode;
static int[] visited;
static ArrayList<ArrayList<Info>> graph;
static class Info {
int node;
int len;
Info(int node, int len) {
this.node = node;
this.len = len;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
v = Integer.parseInt(st.nextToken());
maxLen = Integer.MIN_VALUE;
maxNode = 0;
graph = new ArrayList<>();
// ๊ทธ๋ํ ์ด๊ธฐํ
for (int i = 0; i <= v; i++) {
graph.add(new ArrayList<>());
}
for (int i = 0; i < v; i++) {
st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
while (true) {
int a = Integer.parseInt(st.nextToken());
if (a == -1) {
break;
}
int b = Integer.parseInt(st.nextToken());
graph.get(num).add(new Info(a, b));
}
}
// 1. ์์์ ์ ์ ์์ ๊ฐ์ฅ ๋จผ ์ ์ ์ฐพ๊ธฐ
visited = new int[v + 1];
maxLen = 0;
dfs(1, 0);
// 2. ์ฐพ์ ์ ์ ์์ ๊ฐ์ฅ ๋จผ ์ ์ ๊น์ง ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
visited = new int[v + 1];
maxLen = 0;
dfs(maxNode, 0);
System.out.println(maxLen);
}
static void dfs(int s, int sum) {
visited[s] = 1;
if (maxLen < sum) {
maxLen = sum;
maxNode = s;
}
for (Info info : graph.get(s)) {
if (visited[info.node] == 0) {
dfs(info.node, sum + info.len);
}
}
}
}
๐ ์๊ฐ ๋ณต์ก๋ ๋ถ์
- DFS 1ํ: O(V)
- DFS 2ํ: O(V)
- ์ด ์๊ฐ ๋ณต์ก๋: O(2V) = O(V)