백준 No.1167 [트리의 지름]
문제
1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
www.acmicpc.net
설명
<알고리즘 분류>
* DFS
백준 No.1967 [트리의 지름] (tistory.com)
백준 No.1967 [트리의 지름]
백준 No.1967 [트리의 지름] 문제 1967번: 트리의 지름 (acmicpc.net) 1967번: 트리의 지름 파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온
johoonday.tistory.com
현재 이 문제는 위 링크에서 설명되는 1967번 [트리의 지름] 문제와 정점의 개수 / 간선의 가중치의 범위와 정점, 간선이 입력되는 방식 말고는 다를게 없는 문제이다. 트리의 지름을 구하는 접근 방식은 100.00 % 동일하다.
Code
더보기
#include <iostream>
#include <vector>
#include <cstring>
#define N 100001
using namespace std;
struct s1 {
int nxt;
int dist;
};
int n;
int maxVal = 0;
int maxNode = 0;
vector<s1> nodes[N];
bool visit[N];
void dfs(int cur, int val) {
visit[cur] = true;
if (maxVal < val) {
::maxVal = val;
::maxNode = cur;
}
for (int i = 0; i < nodes[cur].size(); i++) {
int nxt = nodes[cur][i].nxt;
if (!visit[nxt])
dfs(nxt, val + nodes[cur][i].dist);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n;
int cur = 0;
int nxt = 0;
int dis = 0;
for (int i = 1; i <= ::n; i++) {
cin >> cur;
while (cin >> nxt && nxt != -1) {
cin >> dis;
nodes[cur].push_back({nxt, dis});
}
}
dfs(1, 0); // 1번 정점에서 가장 먼 정점을 탐색
memset(visit, false * sizeof(bool), N);
dfs(::maxNode, 0); // 탐색한 정점에서 다시 가장 먼 정점 탐색
cout << ::maxVal;
}
728x90
'Algorithm (C++ based) > BOJ' 카테고리의 다른 글
백준 No.1944 [복제 로봇] (0) | 2023.02.05 |
---|---|
백준 No.2008 [사다리 게임] (0) | 2022.12.04 |
백준 No.1967 [트리의 지름] (0) | 2022.11.28 |
백준 No.1725 [히스토그램] (2) | 2022.11.13 |
백준 No.1167 [트리의 지름] (3) | 2022.07.13 |
댓글