给出
n
≤
1
e
4
n\leq1e4
n≤1e4的带权树,要求这个树的直径大小。树的直径简而言之,就是树上最远点对。
考虑从一点根出发,那么最远的距离就是这个点出发的最长链和次长链的和。
d
p
[
u
]
[
0
∣
1
]
dp[u][0|1]
dp[u][0∣1]分别维护当前点
u
u
u出发的最长距离和次长距离。然后转移。
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int N=1e4+7;
struct edge{ int v,w; };
vector<edge> G[N];
int dp[N][2];
void dfs(int u,int fa) {
for(int i=0;i<G[u].size();i++) {
int v=G[u][i].v;
int w=G[u][i].w;
if(v==fa) continue;
dfs(v,u);
if(dp[v][0]+w>dp[u][0]) {
dp[u][1]=dp[u][0];
dp[u][0]=dp[v][0]+w;
}
else if(dp[v][0]+w>dp[u][1]) {
dp[u][1]=dp[v][0]+w;
}
}
}
int main() {
int u,v,w;
while(scanf("%d%d%d",&u,&v,&w)==3) {
G[u].push_back({v,w});
G[v].push_back({u,w});
}
dfs(1,0);
printf("%d\n",dp[1][0]+dp[1][1]);
return 0;
}