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
- 삼성코딩테스트
- 코테
- bfs문제
- 포스코 ai 교육
- 그리디
- MCU 딥러닝
- TensorFlow Lite
- 영상처리
- 컴퓨팅사고
- dfs
- 포스코 AI교육
- 코테 문제
- dfs문제
- DP
- 다이나믹프로그래밍
- 알고리즘
- DP문제
- 임베디드 딥러닝
- tinyml
- 삼성역량테스트
- BFS
- 삼성역테
- 삼성코테
- 자료구조
- 딥러닝
- 코딩테스트
- 포스코 교육
- tflite
- 초소형머신러닝
- sort
Archives
- Today
- Total
코딩뚠뚠
[백준문제풀이] 1167 트리의 지름 본문
반응형
풀이일시 : 2020-12-28
문제 :
트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.
입력 :
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2≤V≤100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. (정점 번호는 1부터 V까지 매겨져 있다고 생각한다)
먼저 정점 번호가 주어지고, 이어서 연결된 간선의 정보를 의미하는 정수가 두 개씩 주어지는데, 하나는 정점번호, 다른 하나는 그 정점까지의 거리이다. 예를 들어 네 번째 줄의 경우 정점 3은 정점 1과 거리가 2인 간선으로 연결되어 있고, 정점 4와는 거리가 3인 간선으로 연결되어 있는 것을 보여준다. 각 줄의 마지막에는 -1이 입력으로 주어진다. 주어지는 거리는 모두 10,000 이하의 자연수이다.
ex)
5
1 3 2 -1
2 4 4 -1
3 1 2 4 3 -1
4 2 4 3 3 5 6 -1
5 4 6 -1
출력 :
첫째 줄에 트리의 지름을 출력한다.
ex)
11
풀이 :
섵불리 풀기 시작하면 시간을 허비할 가능성이 있다.
트리의 지름을 구하는 방법을 생각해 보는 것도 좋지만 정형화된 방법이 있기 때문에 참고하기 바란다.
> 다른분 블로그 포스팅을 가져왔다..
이러한 공식만 알고 풀게되면 DFS로 쉽게 풀이할 수 있다.
//트리의 지름을 먼저 구해보자
//정점 1에서 시작해서 가장 먼 거리를 y 정점이라고 하자
//이 y정점에서 가장 먼저리인 z가 있다 y-z가 가장 긴 거리이다.
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
int V;
const int MAX = 100001;
vector <pair<int, int>>v[MAX];
int visited[MAX] = { 0, };
int maxdist = 0;
int maxnode;
void input() {
cin >> V;
for (int i = 0; i < V; i++) {
int num, n1, n2;
cin >> num;
cin >> n1;
while (n1 != -1) {
cin >> n2;
v[num].push_back({ n1,n2 });
v[n1].push_back({ num,n2 });
cin >> n1;
}
}
}
void dfs(int i,int dist) {
if (visited[i]) //방문한거면 다시방문X
return;
if (maxdist < dist) { //갱신해나가는과정
maxdist = dist;
maxnode = i;
}
visited[i] = true;
for (int j = 0; j < v[i].size(); j++) {
int ni = v[i][j].first;
int nd = v[i][j].second;
dfs(ni, nd + dist);
}
}
int main() {
input();
dfs(1,0);//1정점에서 시작한다. distance=0으로 들어갈것 maxnode를 구해야된다.
memset(visited, false, sizeof(visited));
maxdist = 0;
dfs(maxnode, 0);//찾은 그 노드에서 가장먼것을 찾는다.
cout << maxdist;
return 0;
}
참고자료 : memset
참고자료 : DFS
참고자료 : vector
반응형
'알고리즘 문제풀이 > 백준문제풀이' 카테고리의 다른 글
[백준문제풀이] 11057 오르막 수 (0) | 2021.01.04 |
---|---|
[백준문제풀이] 10844 쉬운 계단 수 (0) | 2021.01.04 |
[백준문제풀이] 11725 트리의 부모 찾기 (0) | 2021.01.04 |
[백준문제풀이] 1991 트리 순회 (0) | 2021.01.04 |
[백준문제풀이] 2632 피자판매 (0) | 2021.01.04 |