반응형
    
    
    
  https://www.acmicpc.net/problem/1967
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n번째 줄까지 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연결하는 두 노드 중 부모 노드의 번호를 나타내고, 두 번째 정수는 자식 노드를, 세 번째 정수는 간선의 가중치를 나타낸다. 간선에 대한 정보는 부모 노드의 번호가 작은 것이 먼저 입력되고, 부모 노드의 번호가 같으면 자식 노드의 번호가 작은 것이 먼
www.acmicpc.net
나는 이문제를 모든 정점에 대해서 뿌리 노드들을 구하였다. 그러다보니 메모리초과가 발생하여 자료구조를 많이 바꿔서 pass했다. 다른사람들은 어떻게 풀었는지 궁금해서 검색해보았더니 그리디로 접근 가능한것.
1. 임의 정점 a에서 가장 가중치가 큰 노드를 찾는다. b 라고 하겠다.
2. 이제 b에서 가장 가중치가 큰 노드 c를 찾는다.
정답은 b-c 거리가 되겠다. 이게 왜그럴까 생각해보니?? 당연히 되겠거니 생각한다.
아래는 내가 복잡하게 푼 소스
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class B1967 {     static int N;     static int parent[];     static class Pair {         int u;         int w;         public Pair(int u, int w) {             super();             this.u = u;             this.w = w;         }     }     static class BT {         int u;         ArrayList<Pair> list;         public BT(int u) {             this.u = u;             list = new ArrayList<>();         }     }     static BT node[];     static int Find(int x) {         if (x == parent[x]) {             return x;         }         return Find(parent[x]);     }     public static void main(String[] args) throws NumberFormatException, IOException {         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));         N = Integer.parseInt(br.readLine());         node = new BT[N + 1];         parent = new int[N + 1];         for (int n = 1; n <= N; n++) {             parent[n] = n;             node[n] = new BT(n);         }         for (int n = 1; n < N; n++) {             StringTokenizer st = new StringTokenizer(br.readLine());             int u = Integer.parseInt(st.nextToken());             int v = Integer.parseInt(st.nextToken());             int w = Integer.parseInt(st.nextToken());             parent[v] = u;             node[u].list.add(new Pair(v, w));         }         int Answer = 0;         int root = Find(1);         // 여기서 구한 두쌍의 합이 가장큰게 정답이다.         // 정렬 해서 0 1 뽑으면된다.         for (int n = 1; n <= N; n++) {             int value[] = new int[vSize];             if (vSize <= 1 && n!=root)                 continue;             for (int v = 0; v < vSize; v++) {                 value[v] = 0;                 Queue<Pair> q = new LinkedList<>();                 while (!q.isEmpty()) {                     Pair tmp = q.poll();                     value[v] = Math.max(value[v], tmp.w);                         q.add(new Pair(next, sum));                     }                 }             }             int sum = 0;             if (value.length >= 2) {                 sum = value[value.length - 1] + value[value.length - 2];             } else if (value.length == 1) {                 sum = value[0];             }             Answer = Math.max(Answer, sum);         }         System.out.println(Answer);     } } http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter | 
반응형
    
    
    
  'ProgramSoliving' 카테고리의 다른 글
| 백준 : 2251 (0) | 2020.02.25 | 
|---|---|
| 백준 : 5719 (0) | 2020.02.25 | 
| 백준 : 2250 (0) | 2020.02.24 | 
| 백준 : 9019 (0) | 2020.02.23 | 
| 백준 : 9466 (텀 프로젝트) (0) | 2020.02.23 |