题干:

链接:https://ac.nowcoder.com/acm/contest/157/D
来源:牛客网

一年一度的山东省oi夏令营又开始了,每到这个季节,山东的oier们都会欢聚这里,一起学(tuí)习(feì)。当然,为了能更加愉快地学(tuí)习(feì),就少不了要自带电脑,用电便开始成了一种问题,于是便有一种神奇的数据结构诞生了!这就是山东省oi专用数据结构——插排树(如图)

小K为了能更好的学(tuí)习(feì),所以他想尽量的往后做,所以现在请你帮帮他,他最远可以离讲台多远。

已知插排树的根节点在讲台上,有且仅有一个根节点(根节点入度为0),最远距离即所有插排的长度,小K电脑线的长度忽略不计

输入描述:

第一行一个整数n表示有n个节点
然后n-1行,每行三个整数a,b,c,表示插排a是接在插排b上的,插排a的长度为c

输出描述:

一个整数n表示最远距离

示例1

输入

复制

9
2 1 2
3 1 2
4 1 1
5 2 3
6 2 1
7 3 1
8 3 4
9 7 5

输出

复制

8

说明

1=>3=>7=>9

备注:

对于30%的数据 n<233
对于70%的数据 n<2333

对于100%的数据 n<50000

c小于20

a,b小于等于n

解题报告:

   这题数据水了,相当于保证了输入顺序了。所以你直接读入的时候处理就可以了。但是其实应该记录下每个点的入度,然后去跑dfs的。

  两种dfs方法,要么按照一般dp的方式,先dfs,再dp[cur]=max(dp[cur],dp[v]);,最后直接输出dp[root]。

  要么用遍历的方式,,到了每个点,先dis[v]=dis[cur]+边权,再dfs,最后On扫一遍dis数组。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
int n;
vector<int> vv;
int dis[MAX];
int main()
{
	cin>>n;
	for(int a,b,c,i = 1; i<=n-1; i++) {
		cin>>a>>b>>c;
		dis[a] = dis[b] + c;
	}
	int ans = 0;
	for(int i = 1; i<=n; i++) ans =  max(ans,dis[i]);
	cout <<ans;
	return 0 ;
}