题干:
链接: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 ;
}