반응형
문제링크:www.acmicpc.net/problem/1967
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
문제풀이를 위해선
1.가장 깊은 노드 중 가중치가 가장 큰 노드를 찾는다.
2. 찾은 노드를 기준 정점으로 잡고, 다시 한번 가장 가중치가 큰 노드를 찾는다.
2가지를 수행하면 된다.
왜 이렇게 되는지에 대한 증명은 구사과님 글을 참고하자.
트리의 지름 (Diameter of tree)
트리에서 정점 두개를 잡고, 거리를 재본다. n^2 쌍의 개수만큼 거리들이 나올텐데... 이 중 가장 거리가 긴 놈을 트리의 지름이라 부른다. dfs 2번 돌려서 O(n)에 해결할 수 있다. 알고리즘 문제 해
koosaga.com
구현난이도는 쉽지만 아이디어 캐치가 어려운 문제였다.
이래서 개발자는 수학베이스가 있어야 하는것인가..
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int n = 0;
bool visited[10001] = { 0, };
vector <pair<int, int>> arr[10001];
int result = 0;
int destination = 0;
void dfs(int cur, int len) {
if (result < len) {
result = len;
destination = cur;
}
for (int i = 0; i < arr[cur].size(); i++) {
if (visited[arr[cur][i].first] == 0) {
visited[arr[cur][i].first] = 1;
dfs(arr[cur][i].first, len + arr[cur][i].second);
}
}
}
int main() {
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 0; i < n - 1; i++) {
int s, e, v;
cin >> s >> e >> v;
arr[s].push_back(make_pair(e, v));
arr[e].push_back(make_pair(s, v));
}
visited[1] = 1;
dfs(1, 0); //목적지 구하고
cout << result << endl;
memset(visited, 0, sizeof(visited));
result = 0;
visited[destination] = 1;
dfs(destination, 0);
cout << result << endl;
}
반응형
'알고리즘 > DFS' 카테고리의 다른 글
[백준] 1167- 트리의 지름(C++) (2) | 2021.03.13 |
---|---|
[백준] 13549-숨바꼭질 3(C++) (0) | 2021.02.01 |
[백준] 3980-선발 명단(C++) (0) | 2021.01.24 |
[백준] 16197-두 동전(C++) (0) | 2021.01.23 |
[백준] 2239-스도쿠(C++) (0) | 2021.01.23 |