Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 그리디
- 백트래킹
- DeepLearning
- 실버쥐
- Algorithm
- dp
- NeuralNetwork
- 캡스톤정리
- 백준
- Swift
- 플로이드와샬
- Docker
- C++
- sigmoid
- 프로그래머스
- mysql
- ReLU
- 탐색
- 풀이
- 알고리즘
- Node.js
- dfs
- 부르트포스
- ios
- BFS
- Stack
- Blockchain
- 문제풀이
- Greedy
- 그래프
Archives
- Today
- Total
개발아 담하자
[백준/C++] 1167 번 : 트리의 지름 풀이 본문
1167번 : 트리의 지름
문제 링크 : www.acmicpc.net/problem/1167
문제
트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.
입력
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2≤V≤100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. (정점 번호는 1부터 V까지 매겨져 있다고 생각한다)
먼저 정점 번호가 주어지고, 이어서 연결된 간선의 정보를 의미하는 정수가 두 개씩 주어지는데, 하나는 정점번호, 다른 하나는 그 정점까지의 거리이다. 예를 들어 네 번째 줄의 경우 정점 3은 정점 1과 거리가 2인 간선으로 연결되어 있고, 정점 4와는 거리가 3인 간선으로 연결되어 있는 것을 보여준다. 각 줄의 마지막에는 -1이 입력으로 주어진다. 주어지는 거리는 모두 10,000 이하의 자연수이다.
출력
첫째 줄에 트리의 지름을 출력한다.
트리의 가장 긴 지름을 구하기 위해선 두 가지 단계가 필요하다.
- 루트 노드에서 가장 멀리 있는 (거리 가중치가 가장 큰) 노드를 선택한다.
- 그 노드를 기준으로 가장 먼 것을 선택한다. 이 때 누적된 거리 합이 정답이다.
전체 코드
#include <iostream>
#include <cstring>
#include <vector>
#define MAX 100001
using namespace std;
int v;
vector<pair<int, int>> graph[MAX];
bool visited[MAX];
int diameter, farthest_node; // 지름, 루트에서 가장 먼 노드
void dfs(int node, int cost){
if(visited[node]) return;
visited[node] = true;
// 지름 업데이트
if(diameter < cost) {
diameter = cost;
farthest_node = node;
}
for(int i=0; i<graph[node].size(); i++){
dfs(graph[node][i].first, cost + graph[node][i].second);
}
}
int main(void){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> v;
while(v--){
int node;
cin >> node;
while(true){
int node2, cost;
cin >> node2;
if(node2 == -1) break;
cin >> cost;
graph[node].push_back(make_pair(node2, cost));
}
}
// 루트에서 가장 먼 정점 찾기
memset(visited, false, sizeof(visited));
dfs(1, 0);
// 가장 먼 정점에서 탐색 시작
memset(visited, false, sizeof(visited));
diameter = 0; // 초기화
dfs(farthest_node, 0);
cout << diameter << '\n';
return 0;
}
'👩💻 알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준/C++] 1399 번 : 단어 수학 풀이 (0) | 2021.01.29 |
---|---|
[백준/C++] 2529 번 : 부등호 풀이 (0) | 2021.01.28 |
[백준/C++] 1541 번 : 잃어버린 괄호 풀이 (0) | 2021.01.22 |
[백준/C++] 13460 번 : 구슬 탈출2 풀이 (0) | 2021.01.21 |
[백준/C++] 10451 번 : 순열 사이클 풀이 (0) | 2021.01.21 |