1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
#include <cstdio>
#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));
queue<int> q;
check[start] = true;
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) {
dist[e.to] = dist[x] + e.cost;
q.push(e.to);
check[e.to] = true;
}
}
}
}
int main() {
int n;
scanf("%d",&n);
for (int i=0; i<n-1; i++) {
int u, v, w;
scanf("%d %d %d",&u,&v,&w);
a[u].push_back(Edge(v,w));
a[v].push_back(Edge(u,w));
}
bfs(1);
int start = 1;
for (int i=2; i<=n; i++) {
if (dist[i] > dist[start]) {
start = i;
}
}
bfs(start);
int ans = dist[1];
for (int i=2; i<=n; i++) {
if (ans < dist[i]) {
ans = dist[i];
}
}
printf("%d\n",ans);
return 0;
}
#include <cstdio>
#include <algorithm>
#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];
pair<int, int> dfs(int x) { // first: diameter, second: height
check[x] = true;
vector<int> heights;
int ans = 0;
for (auto &e : a[x]) {
int y = e.to;
int cost = e.cost;
if (check[y] == false) {
auto p = dfs(y);
if (ans < p.first) ans = p.first;
heights.push_back(p.second+cost);
}
}
int height = 0;
sort(heights.begin(), heights.end());
reverse(heights.begin(), heights.end());
if (heights.size() >= 1) {
height = heights[0];
if (ans < height) {
ans = height;
}
}
if (heights.size() >= 2) {
if (ans < heights[0] + heights[1]) {
ans = heights[0] + heights[1];
}
}
return make_pair(ans, height);
}
int main() {
int n;
scanf("%d",&n);
for (int i=0; i<n-1; i++) {
int u, v, w;
scanf("%d %d %d",&u,&v,&w);
a[u].push_back(Edge(v,w));
a[v].push_back(Edge(u,w));
}
auto ans = dfs(1);
cout << ans.first << '\n';
return 0;
}
'Problem set' 카테고리의 다른 글
[LeetCode] Find Pivot Index (0) | 2022.08.26 |
---|---|
[LeetCode] Move Zeroes (0) | 2022.08.26 |
[백준] 1167 트리의 지름 (0) | 2021.02.20 |
[백준] 11725 트리의 부모 찾기 (0) | 2021.02.20 |
[백준] 2250 트리의 높이와 너비 (0) | 2021.02.20 |