접근은 쉬웠지만 구현이 어려웠던 문제.
처음엔 DFS로 풀어보려 시도했으나 (많은 분들이 DFS로 푸셨더라)
시간초과가 자꾸 발생했다.
이유는 맨 밑 자식 노드들 중에서 경로가 가장 긴 자식 노드를 찾고,
그 노드에서 다른 자식 노드들까지의 경로 중 최대값을 구하는 코드였는데
시간 복잡도가 O(N^3)가 나오기때문.
그리하여 BFS로 바꾸어 풀었다.
루트에서 가장 경로가 긴 노드를 찾고
그 노드에서 가장 멀리 있는 노드를 찾는 코드다.
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 | #include<stdio.h> #include<iostream> #include<queue> #include<vector> #include<memory.h> #include<algorithm> using namespace std; int n; vector<vector<int>>link; vector<vector<int>>link2; vector<int>son; vector<int>ans; bool check[10001]; int dist[10001]; void bfs(int from) { memset(dist, 0, sizeof(dist)); memset(check, false, sizeof(check)); queue<int>q; q.push(from); check[from] = true; while (!q.empty()) { int x = q.front(); q.pop(); for (int i = 0; i < link[x].size(); i++) { int to = link[x][i]; int cost = link2[x][i]; if (check[to] == false) { check[to] = true; dist[to] = dist[x] + cost; q.push(to); } } } } int main() { //freopen("Text.txt", "r", stdin); cin >> n; link.resize(n + 1); link2.resize(n + 1); for (int i = 0; i < n - 1; i++) { int a, b, len; scanf("%d %d %d", &a, &b, &len); link[a].push_back(b); link2[a].push_back(len); link[b].push_back(a); link2[b].push_back(len); } bfs(1); int highest = 1; for (int i = 1; i <= n; i++) { if (dist[highest] < dist[i]) { highest = i; } } bfs(highest); int ans = -1; for (int i = 1; i <= n; i++) { ans = max(ans, dist[i]); } cout << ans; } | cs |
'BOJ' 카테고리의 다른 글
백준 5427 / 불 (0) | 2019.01.08 |
---|---|
백준 1600 / 말이 되고픈 원숭이 (0) | 2019.01.08 |
백준 2146 / 다리 만들기 (0) | 2019.01.05 |
백준 9019 / DSLR (0) | 2019.01.05 |
백준 2573 / 빙산 (0) | 2019.01.04 |