hihoCoder 1050 트 리 중 가장 긴 길, 가장 상세 한 문제 풀이 보고서
문제 풀이 방향: 모든 점 을 전환점 t 로 삼 아 t 를 뿌리 노드 로 하 는 서브 트 리 중의 '최 장 로' 와 '최 장 로' 와 겹 치지 않 는 '차장 로' 를 구하 고 이 두 길의 길이 의 합 으로 답 을 업데이트 한다. 최종 답 은 바로 이 나무의 최 장 길이 이다.각 노드 에 유사 한 후 순위 로 차례대로 접근 하고 아래 에서 위로 각 노드 의 first 값 과 second 값 을 차례대로 계산 하면 O (N) 의 시간 복잡 도로 이 문 제 를 해결 할 수 있다.
구체 적 인 알고리즘 (자바 버 전, 직접 AC 가능)
1 import java.util.*;
2
3 public class Main {
4
5 public class Node {
6 public Node parent;//
7 public List<Node> children;//
8 public int first; //
9 public int second;//
10 public int val;
11
12 public Node(int val, Node parent) {
13 this.val = val;
14 this.first = 0;
15 this.second = 0;
16 this.parent = parent;
17 this.children = new ArrayList<Node>();
18 }
19
20 // first second
21 public void update() {
22 if (this.children.size() == 0) {//
23 this.first = this.second = 0;
24 } else if (this.children.size() == 1) {//
25 this.first = this.children.get(0).first + 1;
26 this.second = 0;
27 } else {// 2
28 int[] array = new int[this.children.size()];
29 for (int i = 0; i < this.children.size(); i++) {
30 array[i] = this.children.get(i).first;
31 }
32 Arrays.sort(array);
33 this.first = array[array.length - 1] + 1;
34 this.second = array[array.length - 2] + 1;
35 }
36 }
37
38 // first second( )
39 public void updateAll() {
40 for (Node child : this.children) {
41 child.updateAll();
42 }
43 this.update();
44 }
45 }
46
47 public int n;
48 public int index;
49 public int max;
50 public Node[] nodeMap;
51
52 public Main(Scanner scanner, int n) {
53 this.n = n;
54 this.nodeMap = new Node[this.n + 1];
55 for (int i = 0; i < n - 1; i++) {
56 this.create(scanner.nextInt(), scanner.nextInt());
57 }
58 this.index = 1;
59 this.nodeMap[this.index].updateAll();//
60 this.max = this.nodeMap[this.index].first
61 + this.nodeMap[this.index].second;
62 this.index++;
63 }
64
65 //
66 private void create(int from, int to) {
67 Node parent = this.nodeMap[from];
68 Node child = this.nodeMap[to];
69 if (parent == null) {
70 parent = new Node(from, null);
71 this.nodeMap[from] = parent;
72 }
73 if (child == null) {
74 child = new Node(to, parent);
75 this.nodeMap[to] = child;
76 }
77 child.parent = parent;
78 parent.children.add(child);
79 }
80
81 // i
82 private void setRoot(int i) {
83 Node cur = this.nodeMap[i];
84 Node parent = cur.parent;
85 if (parent != null) {//
86 parent.children.remove(cur);//
87 this.setRoot(parent.val);//
88 cur.children.add(parent);//
89 parent.parent = cur;
90 }
91 cur.update();//
92 }
93
94 public void solve() {
95 while (this.index <= this.n) {
96 this.setRoot(this.index);
97 this.nodeMap[this.index].parent = null;// parent null,
98 int sum = this.nodeMap[this.index].first
99 + this.nodeMap[this.index].second;
100 this.index++;
101 this.max = this.max > sum ? this.max : sum;// max
102 }
103 }
104
105 public static void main(String[] args) {
106 Scanner scanner = new Scanner(System.in);
107 int N = scanner.nextInt();
108 Main main = new Main(scanner, N);
109 main.solve();
110 System.out.println(main.max);
111 }
112
113 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.