• D. The Fair Nut and the Best Path 树形dp (终于会了)


    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int maxn=3e5+10;
    int a[maxn];
    int dp[maxn];
    int visit[maxn];
    vector<int> vs[maxn];
    map<pair<int,int>,int> mp;
    int ans=0;
    void dfs(int x)
    {
        visit[x]=1;
        int max1=0;
        int max2=0;
        for(int i=0;i<vs[x].size();i++)
        {
    
            int p=vs[x][i];
            if(visit[p]) continue;//cout<<p<<endl;
            dfs(p);
            int k=dp[p]-mp[{x,p}];
            if(k>=max1) max2=max1,max1=k;
            else if(k>=max2) max2=k;
        }
        //cout<<x<<"  "<<dp[x]<<endl;
        dp[x]=a[x]+max1;
        ans=max(ans,dp[x]);
        ans=max(ans,max1+max2+a[x]);
    }
    int32_t main()
    {
        int n; cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) dp[i]=a[i];
        for(int i=1;i<n;i++)
        {
            int x,y,z; cin>>x>>y>>z;
            vs[x].push_back(y); mp[{x,y}]=z;
            vs[y].push_back(x); mp[{y,x}]=z;
        }
        dfs(1);
        cout<<ans<<endl;
        return 0;
    }
    2994ms
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int maxn=3e5+10;
    int a[maxn];
    int dp[maxn];
    int visit[maxn];
    vector<pair<int,int> > vs[maxn];
    int ans=0;
    void dfs(int x)
    {
        visit[x]=1;
        int max1=0;
        int max2=0;
        for(int i=0;i<vs[x].size();i++)
        {
    
            int p=vs[x][i].first;
            if(visit[p]) continue;//cout<<p<<endl;
            dfs(p);
            int k=dp[p]-vs[x][i].second;
            if(k>=max1) max2=max1,max1=k;
            else if(k>=max2) max2=k;
        }
        //cout<<x<<"  "<<dp[x]<<endl;
        dp[x]=a[x]+max1;
        ans=max(ans,dp[x]);
        ans=max(ans,max1+max2+a[x]);
    }
    int32_t main()
    {
        int n; cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) dp[i]=a[i];
        for(int i=1;i<n;i++)
        {
            int x,y,z; cin>>x>>y>>z;
            vs[x].push_back({y,z}); //mp[{x,y}]=z;
            vs[y].push_back({x,z}); //mp[{y,x}]=z;
        }
        dfs(1);
        cout<<ans<<endl;
        return 0;
    }
    2308ms
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int maxn=3e5+10;
    int a[maxn];
    int dp[maxn];
    int visit[maxn];
    vector<pair<int,int> > vs[maxn];
    int ans=0;
    void dfs(int x)
    {
        visit[x]=1;
        int max1=0;
        int max2=0;
        for(int i=0;i<vs[x].size();i++)
        {
    
            int p=vs[x][i].first;
            if(visit[p]) continue;//cout<<p<<endl;
            dfs(p);
            int k=dp[p]-vs[x][i].second;
            if(k>=max1) max2=max1,max1=k;
            else if(k>=max2) max2=k;
        }
        //cout<<x<<"  "<<dp[x]<<endl;
        dp[x]=a[x]+max1;
        ans=max(ans,dp[x]);
        ans=max(ans,max1+max2+a[x]);
    }
    int32_t main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        int n; cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) dp[i]=a[i];
        for(int i=1;i<n;i++)
        {
            int x,y,z; cin>>x>>y>>z;
            vs[x].push_back({y,z}); //mp[{x,y}]=z;
            vs[y].push_back({x,z}); //mp[{y,x}]=z;
        }
        dfs(1);
        cout<<ans<<endl;
        return 0;
    }
    700+ms
    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int maxn=3e5+10;
    int a[maxn];
    int dp[maxn];
    int visit[maxn];
    vector<pair<int,int> > vs[maxn];
    int ans=0;
    void dfs(int x)
    {
        visit[x]=1;
        int max1=0;
        int max2=0;
        for(int i=0;i<vs[x].size();i++)
        {
    
            int p=vs[x][i].first;
            if(visit[p]) continue;//cout<<p<<endl;
            dfs(p);
            int k=dp[p]-vs[x][i].second;
            if(k>=max1) max2=max1,max1=k;
            else if(k>=max2) max2=k;
        }
        //cout<<x<<"  "<<dp[x]<<endl;
        dp[x]=a[x]+max1;
        ans=max(ans,dp[x]);
        ans=max(ans,max1+max2+a[x]);
    }
    int32_t main()
    {
        /*ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);*/
        int n; scanf("%I64d",&n);
        for(int i=1;i<=n;i++) scanf("%I64d",&a[i]);
        for(int i=1;i<=n;i++) dp[i]=a[i];
        for(int i=1;i<n;i++)
        {
            int x,y,z; scanf("%I64d %I64d %I64d",&x,&y,&z);
            vs[x].push_back({y,z}); //mp[{x,y}]=z;
            vs[y].push_back({x,z}); //mp[{y,x}]=z;
        }
        dfs(1);
        printf("%I64d
    ",ans);
        return 0;
    }
    405ms
  • 相关阅读:
    俺自己可以写点代码了
    学姐,孙哥
    Linux/Unix 常用参数使用说明
    DB2 rollforward 命令使用详解
    DB2 create tablespace
    db2 基础语法
    VMWARE虚拟机不显示主机共享的文件夹解决办法
    DB2创建数据库常用参数详解
    从Linux访问Windows共享目录
    Data Flow >> Source >> Error Output >> Error & Truncation: Ignore Failure, Redirect Now, Fail Component
  • 原文地址:https://www.cnblogs.com/Andromeda-Galaxy/p/10115989.html
Copyright © 2020-2023  润新知