1. ๋ฌธ์ ์ค๋ช
[๋ฌธ์ ๋งํฌ](https://www.acmicpc.net/problem/1167)
2. ์ ๊ทผ ๋ฐฉ์
์์์ ์ ์ ์์ ์ ์ผ ๋จผ ์ ์ ์ ํธ๋ฆฌ์ ์ง๋ฆ์ด ๋๋ ๋ ๊ฐ์ ์ ์ค ํ๋์ด๋ค.
๋ผ๋ ์์ด๋์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์ ๋ฅผ ํผ๋ค. (์์ Idea๊ฐ ์ดํด๊ฐ ์๋๋ค๋ฉด, ํ๋ฒ ์์๋ฅผ ๊ฐ์ง๊ณ ํด๋ณด๋ฉด ๋๋ค. ์ด๋ ์ ์ ์์ ์ถ๋ฐํ๋ , ๊ทธ ์ ์ ์ ์ ์ผ ๋จผ ์ ์ ์ ํธ๋ฆฌ์ ํ ์ถ์ด๋ค.)
- ์์ ์ ์ ์ ์ ๋ ฅํ๋ฉด, ์ ์ผ ๋จผ ์ ์ ๊ณผ ๊ทธ๊น์ง ๊ฐ ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐํํ๋ bfs ํจ์๋ฅผ ๋ง๋ ๋ค.
- ํด๋น ํจ์์ ์์์ ์ ์ (์ ํ์ด์์ 1)์ ๋ฃ๊ณ , ํธ๋ฆฌ์ ์ง๋ฆ์ด ๋๋ ์ ์ ์ ๊ตฌํ๋ค.
- ๋ฐํ ๋ฐ์ ์ ์ ์ ๋ค์ bfs ํจ์์ ์ ๋ ฅํด์, ์ ๋ ฅ ์ ์ ์์ ์ ์ผ ๋จผ ์ ์ ๊ณผ ๊ทธ๊น์ง ๊ฐ ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐํ ๋ฐ๋๋ค.
- ํด๋น ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค.
3. ์ฝ๋ ๋ถ์
import java.io.*;
import java.util.*;
public class Main {
static int V;
static ArrayList<Node> [] list;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
V = Integer.parseInt(br.readLine());
list = new ArrayList[V+1];
for (int i = 1; i <= V; i++) {
list[i] = new ArrayList<>();
}
for (int i = 0; i < V; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
while (st.hasMoreTokens()){
int end = Integer.parseInt(st.nextToken());
if(end == -1) break;
int weight = Integer.parseInt(st.nextToken());
list[start].add(new Node(end, weight));
}
}
Node far_node = bfs(1);
Node ans_node = bfs(far_node.v);
System.out.println(ans_node.w);
}
// ํ ๋
ธ๋์์ ์ ์ผ ๋จผ Node ์ถ๋ ฅ
public static Node bfs (int start) {
int max_vertex = 0;
int max_weight = 0;
boolean [] isVisited = new boolean[V+1];
ArrayDeque<Node> aq1 = new ArrayDeque<>();
aq1.add(new Node(start, 0));
isVisited[start] = true;
while (!aq1.isEmpty()){
Node now = aq1.poll();
if(now.w > max_weight){
max_vertex = now.v;
max_weight = now.w;
}
for (int i = 0; i < list[now.v].size(); i++) {
Node next = list[now.v].get(i);
if(!isVisited[next.v]){
isVisited[next.v] = true;
aq1.add(new Node(next.v, now.w + next.w));
}
}
}
return new Node(max_vertex, max_weight);
}
}
class Node {
int v;
int w;
public Node(int v, int w){
this.v = v;
this.w = w;
}
}
4. ์ฑ์ฅ ํ๊ธฐ
๋๋ ๋ฏธ๋ฐฉ๋ฌธ ์ ์ ์ Node ํด๋์ค๋ฅผ ์๋ก ๋ง๋ค์ด์, ํด๋น Node ๊ฐ์ฒด์ w(๊ฐ์ค์น)์ ์ง๊ธ๊น์ง ๋ค์๋ ๋น์ฉ์ ๋์ ์์ผ์ ๊ณ์ฐํ๋ค. ์ด๋ฐ ์์ผ๋ก ๋งค๋ฒ ์๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ๋ค๋ณด๋, ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๋ง์๋ค. Do it ์๊ณ ๋ฆฌ์ฆ ํ์ด์์๋ BFS ํจ์์๋ ์ ์ ์ index๋ง ๋ฃ๊ณ , distance ๋ฐฐ์ด์ด๋ผ๋ ๋์ ๊ฐ์ค์น ๋ฐฐ์ด์ ๋ง๋ค์ด์ ๊ณ์ฐํ๋ค.
distance ๋ฐฐ์ด
123456
0 | 0 | 0 | 0 | 0 | 0 |
์์ ์ ์ ์ ๋ฒํธ๋ฅผ `2`๋ผ ํ์. 2์์ ๋ง์ฝ ์ ์ 4๋ก ๊ฐ์ ๋ ๊ฐ์ค์น๊ฐ 3์ด ๋ค์๋ค๋ฉด ์ด๋ฅผ distance ๋ฐฐ์ด์ ๋์ ํ๋ค. distance[4]๋ ์์ ์ ์ ์์ ์ ์ ๋ฒํธ 4๊น์ง ์ค๋ ์ต๋จ ๊ฒฝ๋ก์ ๋์ ๊ฐ์ค์น ๊ฐ์ด๋ค.
123456
0 | 0 | 0 | 4 | 0 | 0 |
์ด์ 4๋ฒ์์๋ 6๋ฒ์ผ๋ก๋ง ๊ฐ ์ ์๋๋ฐ, ์ด๋ ๋๋ ๊ฐ์ค์น๊ฐ 7์ด๋ผ๋ฉด ์ ์ `6`์ ์์ ์ ์ `2`์์ ์ต๋จ ๊ฒฝ๋ก๋ก ๊ฐ๋ค๋ฉด ์ด 11์ด๋ผ๋ ๊ฐ์ค์น๊ฐ ๋๋ ๊ฒ์ด๋ค. distance[6] = distance[4] + w (4 -> 6์ผ๋ก ๊ฐ ๋ ๋๋ ๋น์ฉ) = 11
123456
0 | 0 | 0 | 4 | 0 | 11 |
์ด๋ฐ ์์ผ๋ก ๊ฐ์ค์น์ ๋ํ ๋ฐฐ์ด์ ๋ง๋ค์ด ๊ฐ์ค์น ๋ฐ๋ก, BFS๋ฅผ ํตํ ์ ์ ํ์์ ๋ฐ๋ก ํด์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์๋ค. ์ฐธ๊ณ ํ๊ธฐ ์ข์ ๊ฒ ๊ฐ๋ค.