3 条题解

  • 0
    @ 2023-12-12 20:02:21
    #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
      @ 2023-12-12 19:58:03

      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
        @ 2023-12-12 19:55:08
        #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
        上传者