cosnt int N=1e5+10; int n,c,d[N]; vector<int> E<N>; void dfs(int u, int fa) { for (int v : E[u]) { if (v == fa) continue; d[v] = d[u] + 1; if (d[v] > d[c]) c = v; dfs(v, u); } }
int main() { scanf("%d", &n); for (int i = 1; i < n; i++) { int u, v; scanf("%d %d", &u, &v); E[u].push_back(v), E[v].push_back(u); } dfs(1, 0); d[c] = 0, dfs(c, 0); printf("%d\n", d[c]); return 0; }
int n, c = 0, t = 0, s = 0, mx = 0; int d[N]; vector<int> e[N]; vector<int> path;
void dfs1(int u, int fa) { for (auto v : e[u]) { if (v == fa) continue; d[v] = d[u] + 1; if (d[v] > d[c]) c = v; dfs1(v, u); } }
bool dfs2(int u, int fa) { // 寻找 t,并把路径 push 回溯 if (u == t) { path.push_back(u); return true; } for (auto v : e[u]) { if (v == fa) continue; if (dfs2(v, u)) { path.push_back(u); return true; } } return false; }
树形dp
我们定义 dp[u]:以 u为根的子树中,从 u 出发的最长路径。那么容易得出转移方程: dp[u]=max(dp[u],dp[v]+w(u,v)),其中的
v 为
u 的子节点, w(u,v) 表示所经过边的权重。