zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    JSP总结1
    EL总结2-域
    EL总结1
    getRealPath和getContextPath
    mybatis获取参数数值的两个方式
    进程与线程区别与联系
    进程间通信和线程间通信的区别
    STRLEN
    二叉树数据结构和算法
    TYPDEF使用注意部分
  • 原文地址:https://www.cnblogs.com/Andromeda-Galaxy/p/10115989.html
Copyright © 2011-2022 走看看