Closed yeongleej closed 1 month ago
🤔 시간복잡도 고려사항
n - 1
, 양방향 그래프로 구현 → 2n - 2
O(N + E)
(N: 정점, E: 간선)💡 풀이 아이디어
트리의 길이 = (한 지점에서 가장 멀리 떨어져 있는 지점)에서 또 다시 그 지점에서 가장 멀리 떨어져 있는 지점
maxInfo[]
maxInfo[0]
: 가장 멀리 떨어져 있는 Node
의 idx
저장maxInfo[1]
: 가장 멀리 떨어져 있는 Node
가 start
지점으로부터 얼마나 떨어져있는지 저장int[] getMaxDisInfo(int start)
: start
지점으로부터 가장 멀리 떨어져있는 노드의 정보 구하기
한 리프 노드에서 다른 리프 노드까지의 가중치 합의 최대치
를 구하는 문제루트로부터 가장 멀리 떨어져 있는 리프 노드
를 시작 노드로 선택하면 최적의 해// 루트로부터 가장 멀리 떨어져 있는 리프 노드 찾기
visited = new boolean[n + 1];
dfs(1, 0);
// 선택된 리프 노드에서 다른 리프노드까지의 최대 가중치를 찾기
visited = new boolean[n + 1];
dfs(maxNode, 0);
모든 리프 노드에서 값을 계산해줬는데 1500ms 나와서 그리디하게 바꿨습니다..
🤔 시간복잡도 고려사항
💡 풀이 아이디어
트리의 특징
트리의 특징에 따라 임의의 노드에서 가장 먼 노드를 찾고, 그 노드에서 다시 먼 노드를 찾으면 트리의 지름을 구할 수 있다.
🤔 시간복잡도 고려사항
💡 풀이 아이디어
가장 긴 지름
dfs를 통해 시작노드a로부터 가장 먼 노드b구하기 2번 반복
🤔 시간복잡도 고려사항
O(n^2)
까지 가능💡 풀이 아이디어
트리에 존재하는 모든 경로들 중에서 가장 긴 것의 길이 구하기
최소신장트리 불가한 이유 이미 주어진 트리는 최소 간선으로 연결되어 있기 때문에 union&find 진행할 필요없음
BFS 불가한 이유 BFS는 각 간선의 가중치를 고려하지 않고 단순히 레벨을 따라 탐색하기 때문에 간선의 가중치가 모두 다르므로 가장 큰 가중치 값을 구할 수 없음
처음에 문제를 보고 최소신장트리 인줄 알았는데, DFS 문제였군요! 양방향으로 탐색하는 새로운 탐색 방법을 알게 됐어요
🤔 시간복잡도 고려사항
n<=10,000 O(N^2)
까지 가능
💡 풀이 아이디어
트리의지름(트리의 모든 경로 중 가장 긴 경로) -> DFS
로 탐색
임의의 노드에서 가장 먼 노드 찾기 -> 첫번째 DFS 수행 -> 두번째 DFS 수행 -> 트리의 지름