zoukankan      html  css  js  c++  java
  • [CF1083A] The Fair Nut and the Best Path

    Description

    点有正权,边有负权。在这样的无根树中找到一条权重最大的链并输出权重。
    $ 1 leq n leq 3 imes 10^5,0 leq w_i leq 10^9,1 leq c_i leq 10^9 $

    Solution

    重要结论:如果一条路径正向反向不同时合法,则它一定存在一条子路径比它更优(想到了就很显然)

    于是我们就可以当做无向链处理了

    (f[i]) 表示到 (i) 结尾的一条直链的最大值

    递推 (f[]) 时,选取最大儿子即可

    更新答案时,选取最大儿子和次大儿子即可

    #include <bits/stdc++.h>
    using namespace std;
    
    #define int long long
    const int N = 1000005;
    
    struct edge {
        int q,c;
    };
    
    int n,w[N],f[N],v[N],ans;
    vector <edge> g[N];
    
    void dfs(int p) {
        v[p]=1;
        int mx=0,sc=0;
        for(edge e:g[p]) {
            int q=e.q, c=e.c;
            if(v[q]) continue;
            dfs(q);
            if(f[q]-c>mx) {
                sc=mx;
                mx=f[q]-c;
            }
            else if(f[q]-c>sc) {
                sc=f[q]-c;
            }
        }
        f[p]=mx+w[p];
        ans=max(ans,mx+sc+w[p]);
    }
    
    signed main() {
        ios::sync_with_stdio(false);
        cin>>n;
        for(int i=1;i<=n;i++) cin>>w[i];
        for(int i=1;i<n;i++) {
            int t1,t2,t3;
            cin>>t1>>t2>>t3;
            g[t1].push_back({t2,t3});
            g[t2].push_back({t1,t3});
        }
        dfs(1);
        cout<<ans;
    }
    
    
  • 相关阅读:
    bzoj violet系列 (2708~2725)
    bzoj4692: Beautiful Spacing
    896.Montonic Array
    56. Merge Intervals
    767. Reorganize String
    872. Leaf-Similar Trees
    使用Spring MVC开发RESTful API(续)
    690. Employee Importance
    429. N-ary Tree Level Order Traversal
    使用Spring MVC开发RESTful API
  • 原文地址:https://www.cnblogs.com/mollnn/p/12834350.html
Copyright © 2011-2022 走看看