3 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int maxn = 1e4 + 5; int n, f1[maxn], f2[maxn], f3[maxn], son[maxn]; struct Edge { int v, w; }; vector<Edge> g[maxn]; void dfs(int u) { int& s = son[u]; for (auto e : g[u]) { int v = e.v, w = e.w; dfs(v); if (f1[v] + w > f1[u]) { f1[u] = f1[v] + w; son[u] = v; } } for (auto e : g[u]) { int v = e.v, w = e.w; if (v != s) f2[u] = max(f2[u], f1[v] + w); } } void dfs2(int u, int p, int w) { if (u == 1) f3[u] = 0; else { if (u == son[p]) f3[u] = w + max(f3[p], f2[p]); else f3[u] = w + max(f3[p], f1[p]); } for (auto e : g[u]) { dfs2(e.v, u, e.w); } } void test() { puts("[test]"); for (int i = 1; i <= n; i++) printf("son[%d] = %d\n", i, son[i]); } int main() { scanf("%d", &n); for (int i = 2; i <= n; i++) { int a, b; scanf("%d%d", &a, &b); g[a].push_back({i, b}); } dfs(1); dfs2(1, 0, 0); for (int i = 1; i <= n; i++) printf("%d\n", max(f1[i], f3[i])); // test(); return 0; } -
0
80分代码:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e4 + 5; int n, f1[maxn], f2[maxn], f3[maxn], son[maxn]; struct Edge { int v, w; }; vector<Edge> g[maxn]; void dfs(int u) { int& s = son[u]; for (auto e : g[u]) { int v = e.v, w = e.w; dfs(v); f1[u] = max(f1[u], f1[v] + w); if (!s || f1[v] > f1[s]) s = v; } for (auto e : g[u]) { int v = e.v, w = e.w; if (v != s) f2[u] = max(f2[u], f1[v] + w); } } void dfs2(int u, int p, int w) { if (u == 1) f3[u] = 0; else { if (u == son[p]) f3[u] = w + max(f3[p], f2[p]); else f3[u] = w + max(f3[p], f1[p]); } for (auto e : g[u]) { dfs2(e.v, u, e.w); } } int main() { scanf("%d", &n); for (int i = 2; i <= n; i++) { int a, b; scanf("%d%d", &a, &b); g[a].push_back({i, b}); } dfs(1); dfs2(1, 0, 0); for (int i = 1; i <= n; i++) printf("%d\n", max(f1[i], f3[i])); return 0; } -
0
#include <bits/stdc++.h> using namespace std; const int maxn = 10010; int n, p[maxn], son[maxn], f1[maxn], f2[maxn], f3[maxn]; struct Edge { int v, w; Edge () {}; Edge (int _v, int _w) { v = _v; w = _w; } }; vector<Edge> g[maxn]; void dfs1(int u) { int sz = g[u].size(); for (int i = 0; i < sz; i ++) { int v = g[u][i].v, w = g[u][i].w; dfs1(v); // 记忆化搜索,先把v的相关信息求出来 } // 求解f1[u]和son[u] for (int i = 0; i < sz; i ++) { int v = g[u][i].v, w = g[u][i].w; if (f1[v] + w > f1[u]) { f1[u] = f1[v] + w; son[u] = v; } } // 求解f2[u] for (int i = 0; i < sz; i ++) { int v = g[u][i].v, w = g[u][i].w; if (v == son[u]) continue; if (f1[v] + w > f2[u]) { f2[u] = f1[v] + w; } } } void dfs2(int u, int len) { // u表示当前点,len表示u连向其父节点p的边的长度 if (u == 1) { f3[u] = 0; // 根节点的f3值为0 } else { if (u == son[p[u]]) f3[u] = len + max(f2[p[u]], f3[p[u]]); else f3[u] = len + max(f1[p[u]], f3[p[u]]); } int sz = g[u].size(); for (int i = 0; i < sz; i ++) { int v = g[u][i].v, w = g[u][i].w; dfs2(v, w); } } int main() { while (scanf("%d", &n) != EOF) { for (int i = 1; i <= n; i ++) { // 初始化,虽然有些不是必要的 g[i].clear(); f1[i] = f2[i] = f3[i] = son[i] = p[i] = 0; } for (int i = 2; i <= n; i ++) { int a, b; scanf("%d%d", &a, &b); p[i] = a; g[a].push_back(Edge(i, b)); } dfs1(1); dfs2(1, 0); for (int i = 1; i <= n; i ++) printf("%d\n", max(f1[i], f3[i])); } return 0; }
- 1
信息
- ID
- 64
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 7
- 已通过
- 2
- 上传者