[백준/C++]#1967 - 트리의 지름
2021. 2. 19. 14:39ㆍ필요/코딩테스트(백준)
풀이
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
struct Edge {
int to;
int cost;
Edge(int to, int cost) : to(to), cost(cost) {}
};
vector <Edge> A[10001];
bool check[10001];
int dist[10001];
void bfs(int start) {
memset(dist, 0, sizeof(dist));
memset(check, false, sizeof(check));
check[start] = true;
queue <int> q;
q.push(start);
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i=0; i<A[x].size(); i++) {
Edge &e = A[x][i];
if (check[e.to]==false) {
q.push(e.to);
check[e.to]=true;
dist[e.to]= dist[x] + e.cost;
}
}
}
}
int main() {
int n;
cin >> n;
for (int i=0; i<n-1; i++) {
int a, b, c;
cin >> a >> b >> c;
A[a].push_back(Edge(b, c));
A[b].push_back(Edge(a, c));
}
bfs(1);
int start = 1;
for (int i=2; i<=n; i++) {
if (dist[start] < dist[i]) {
start = i;
}
}
bfs(start);
int ans = dist[1];
for (int i=2; i<=n; i++) {
if (ans < dist[i]) {
ans = dist[i];
}
}
cout << ans;
return 0;
}
개념
https://etyoungsu.tistory.com/76
이전 문제와 동일한 개념을 가진다.
풀이
입력 받는 부분에서 조금 차이가 있다. 더욱 간단하다.
트리는 두 노드 사이에 하나의 경로만 존재한다.
이는 노드가 n개이면, 간선은 n-1개 라는 것을 의미한다.
n을 입력받고, n-1번 간선을 입력받는다.
A[a].push_back(Edge(b, c));
A[b].push_back(Edge(a, c));
각각 노드 a에 다음 노드b와 가중치 c 저장을 한다.
그리고 노드 b에 다음 노드a와 가중치 c를 저장한다.
무방향그래프이기 때문이다.
'필요 > 코딩테스트(백준)' 카테고리의 다른 글
[백준/C++]#13910, 13902- 개업, 개업2 (0) | 2022.08.18 |
---|---|
[백준/C++]#1654 - 랜선 자르기 (0) | 2022.08.15 |
[백준/C++]#1167 - 트리의 지름 (0) | 2021.02.18 |
[백준/C++]#11725 - 트리의 부모 찾기 (0) | 2021.02.17 |
[백준/C++]#1991 - 트리 순회 (2) | 2021.02.16 |