티스토리 뷰

백준

백준 소스코드 [C++] 1967 트리의 지름

Hani_Levenshtein 2021. 1. 5. 04:00

www.acmicpc.net/problem/1967

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연

www.acmicpc.net

백준 소스코드 [C++] 1967 트리의 지름

#include <iostream>
#include <algorithm>
#include <queue>
#include <string.h>
#include <limits.h>
#include <vector>
#include <math.h>
#include <stack>
#include <bitset>
#include <string>
#include <set>
#define all(v) v.begin(), v.end()
#define pii pair<int,int>
#define make_unique(v) v.erase(unique(v.begin(), v.end()), v.end())
typedef long long ll;
using namespace std;

vector<pii> v[10001];
int res[10001];
int sum[10001];
void dfs(int n) {
	if (v[n].size() == 0) {
		res[n] = 0;
		sum[n] = 0;
		return;
	}
	else if (v[n].size() == 1) {
		dfs(v[n][0].first);
		res[n] = v[n][0].second + sum[v[n][0].first];
		sum[n] = v[n][0].second + sum[v[n][0].first];
	}
	else {
		int k = v[n].size();
		for(int i=0;i<k;i++)
			dfs(v[n][i].first);
		vector<int>w;
		w.clear();
		for (int i = 0;i < k;i++)
			w.push_back(v[n][i].second + sum[v[n][i].first]);
		sort(all(w));
		res[n] = w[k - 1] + w[k - 2];
		sum[n] = w[k - 1];
	}
}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n, a, b, c;
	cin >> n;
	for (int i = 1;i < n;i++) {
		cin >> a >> b >> c;
		v[a].push_back({ b,c });
	}
	dfs(1);
	int m = INT_MIN;
	for (int i = 1;i <= n;i++) {
		if (m < res[i]) m = res[i];
	}
	cout << m;
	return 0;
}
댓글