[백준 1967번 C/C++] 트리의 지름
[백준 1967번 C/C++] 트리의 지름
https://www.acmicpc.net/problem/1967
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
해결전략
깊이우선탐색 DFS
정답코드
#include <iostream>
#include <vector>
using namespace std;
struct Node {
int next;
int cost;
};
int n;
int maxCost, maxNode; // maxCost: 최대 비용, maxNode: 최대 비용을 가지는 노드 번호
vector<vector<Node>> v;
//vector<Node> v[n]; // 위와 같음
vector<int> ch; // 방문체크
void DFS(int cur, int cost) // 현재 노드(cur), 현재까지의 비용(cost)
{
ch[cur] = 1; // 현재 노드를 방문 처리
// maxCost를 업데이트. 기존의 최대 비용보다 현재 비용이 더 크다면, 현재 비용과 현재 노드를 최대 비용과 최대 비용 노드로 갱신
if (maxCost < cost) {
maxCost = cost;
maxNode = cur;
}
// 현재 노드에 연결된 모든 노드를 순회
for (int i = 0; i < v[cur].size(); i++)
{
int next = v[cur][i].next;
if (ch[next] == 0) { // 다음 노드가 방문되지 않았다면, 해당 노드로 DFS를 재귀 호출
DFS(next, cost + v[cur][i].cost);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n;
v.resize(n+1); // 노드 번호가 1부터 시작하므로 n+1로 변경
ch.resize(n+1);
int a, b, cost;
for (int i = 0; i < n-1; i++) { // 트리이므로 n-1개의 간선이 존재
cin >> a >> b >> cost;
v[a].push_back({ b, cost });
v[b].push_back({ a, cost });
}
maxCost = 0; // 최대 비용을 저장할 변수를 0으로 초기화
maxNode = 1; // 시작 노드를 1로 초기화(노드 번호가 1부터 시작하는 경우)
DFS(1, 0); // 1번 노드부터 탐색 시작
fill(ch.begin(), ch.end(), 0); // 방문 체크 배열을 0으로 초기화
maxCost = 0; // 최대 비용을 저장할 변수를 0으로 초기화
DFS(maxNode, 0); // 가장 멀리 있는 노드부터 다시 탐색 시작
cout << maxCost << "\n";
return 0;
}
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 9935번 C/C++] 문자열 폭발 (0) | 2024.01.02 |
---|---|
[백준 5639번 C/C++] 이진 검색 트리 (0) | 2023.12.28 |
[백준 15655번 C/C++] N과 M (6) (0) | 2023.12.25 |
[백준 15654번 C/C++] N과 M (5) (0) | 2023.12.24 |
[백준 9465번 C/C++] 스티커 (0) | 2023.12.23 |
댓글
이 글 공유하기
다른 글
-
[백준 9935번 C/C++] 문자열 폭발
[백준 9935번 C/C++] 문자열 폭발
2024.01.02 -
[백준 5639번 C/C++] 이진 검색 트리
[백준 5639번 C/C++] 이진 검색 트리
2023.12.28 -
[백준 15655번 C/C++] N과 M (6)
[백준 15655번 C/C++] N과 M (6)
2023.12.25 -
[백준 15654번 C/C++] N과 M (5)
[백준 15654번 C/C++] N과 M (5)
2023.12.24