题意
给你一棵树,求每个点在树上的最远距离是多少?
先输入N,表示有N个点,接来下N-1行输入v和w,表示2~n和第 i 个点和 v 之间有边,边权为w。
思路
放个西北工业大学在B站上的视频链接,大家自己去看吧。链接!!!
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+5;
int n, dp[MAXN][2], pre[MAXN];
vector<pair<int, int> > G[MAXN];
#define X first
#define Y second
void dfs1(int u, int fa)
{
pre[u] = fa;
for (auto i : G[u])
{
int v = i.X, w = i.Y;
if (v != fa)
{
dfs1(v, u);
dp[u][1] = max(dp[u][1], dp[v][1]+w);
}
}
}
void dfs2(int u, int fa)
{
dp[u][0] = dp[fa][0];
int t = 0;
for (auto i : G[fa])
{
int v = i.X, w = i.Y;
if (v == pre[fa]) continue;
if (v == u) t = w;
else dp[u][0] = max(dp[u][0], dp[v][1]+w);
}
dp[u][0] += t;
for (auto i : G[u])
{
int v = i.X, w = i.Y;
if (v != fa) dfs2(v, u);
}
}
int main()
{
while (~scanf("%d", &n))
{
memset(dp, 0, sizeof(dp));
for (int i = 0; i <= n; i++) G[i].clear();
for (int u = 2; u <= n; u++)
{
int v, w; scanf("%d%d", &v, &w);
G[u].emplace_back(v, w);
G[v].emplace_back(u, w);
}
dfs1(1, 0); dfs2(1, 0);
for (int i = 1; i <= n; i++)
printf("%d\n", max(dp[i][0], dp[i][1]));
}
return 0;
}
/*
5
1 1
2 1
3 1
1 1
*/