반응형
https://www.acmicpc.net/problem/1967
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
[ 문제풀이 ]
풀이 방법을 생각해내는데 시간이 조금 걸렸지만 방법만 알아낸다면 매우 쉬운 문제였습니다.
먼저 지름은 어떤 점에서 출발하던 지 가장 먼 곳에 있습니다. 이를 이용하여 먼저 한 점에서 가장 먼 점을 찾고, 그 점으로부터 가장 먼 점을 찾으면 지름을 구할 수 있습니다.
[ 소스 코드 ]
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 | #include<iostream> #include<vector> #include<cstring> using namespace std; struct Node { int to; int dist; }; int n; vector<Node> list[10001]; int visited[10001]; int snode; int diameter; void dfs(int num, int dist) { if (visited[num] == 1) { return; } if (diameter < dist) { diameter = dist; snode = num; } visited[num] = 1; for (int i = 0; i < list[num].size(); i++) { int next = list[num][i].to; int nextDist = list[num][i].dist; dfs(next, dist + nextDist); } } int main() { cin >> n; for (int i = 0; i < n-1; i++) { int p, c, d; scanf("%d %d %d", &p, &c, &d); list[p].push_back({ c,d }); list[c].push_back({ p,d }); } dfs(1, 0); //한 노드에서 가장 먼 노드를 찾기 memset(visited, 0, sizeof(visited)); dfs(snode, 0); //위에서 찾은 노드에서 가장 먼 노드를 찾기 cout << diameter; } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 17404번 - RGB거리 2 (C++) (0) | 2022.06.18 |
---|---|
[ 백준 ] 7662번 - 이중 우선순위 큐 (C++) (0) | 2022.06.17 |
[ 백준 ] 13549번 - 숨바꼭질 3 (C++) (0) | 2022.06.15 |
[ 백준 ] 9935번 - 문자열 폭발 (C++) (0) | 2022.06.14 |
[ 백준 ] 2638번 - 치즈 (C++) (0) | 2022.06.13 |