반응형
https://www.acmicpc.net/problem/1167
1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
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 58 59 60 61 62 63 | #include <iostream> #include <vector> #include <cstring> using namespace std; struct node { int to; int dist; }; int V; vector<node> list[100001]; int visited[100001]; int startNode; int ans; void dfs(int num, int dist) //시작점으로부터 가장 먼 노드와 거리를 저장 { if (visited[num] == 1) { return; } visited[num] = 1; if (ans < dist) { ans = dist; startNode = num; } 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 >> V; for (int i = 0; i < V; i++) { int n; cin >> n; while (1) { int to; scanf("%d", &to); if (to != -1) { int dist; scanf("%d", &dist); list[n].push_back({ to,dist }); } else { break; } } } dfs(1, 0); //1번 노드에서 가장 먼 노드 저장 memset(visited, 0, sizeof(visited)); dfs(startNode, 0); //시작 노드부터 가장 먼 노드와 거리 저장 cout << ans; } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 14003번 - 가장 긴 증가하는 부분 수열 5 (C++) (0) | 2022.06.21 |
---|---|
[ 백준 ] 9328번 - 열쇠 (C++) (0) | 2022.06.20 |
[ 백준 ] 17404번 - RGB거리 2 (C++) (0) | 2022.06.18 |
[ 백준 ] 7662번 - 이중 우선순위 큐 (C++) (0) | 2022.06.17 |
[ 백준 ] 1967번 - 트리의 지름 (C++) (0) | 2022.06.16 |