码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-12-13 20:25:53      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:isp   ax1   long   open   oid   ++   pat   cond   c++   

技术分享图片
#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\n",ans);
    return 0;
}
405ms

 

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

标签:isp   ax1   long   open   oid   ++   pat   cond   c++   

原文地址:https://www.cnblogs.com/Andromeda-Galaxy/p/10115989.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!