加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

hdu 5834 Magic boy Bi Luo with his excited tree

发布时间:2020-12-14 01:37:20 所属栏目:大数据 来源:网络整理
导读:首先,如果要求的是以1作为开始位置的话,很容易想到一个dp[u][2],其中dp[u][0]表示以u节点为开始位子的子树最后回到u节点获得最大值,dp[u][1]表示不回来。转移就显而易见了。 然后,考虑如果u节点结果已经计算出,怎么计算他的儿子节点v的答案。 那么,也

首先,如果要求的是以1作为开始位置的话,很容易想到一个dp[u][2],其中dp[u][0]表示以u节点为开始位子的子树最后回到u节点获得最大值,dp[u][1]表示不回来。转移就显而易见了。

然后,考虑如果u节点结果已经计算出,怎么计算他的儿子节点v的答案。

那么,也容易想到转移ans[v]=max(dp[v][1],dp2[u][!v][0] + dp[v][1] - 2 * c,dp2[u][!v][1] + dp[v][0] - c), 其中dp2[u][!v][0]表示以u为根节点,不遍历以v且回到u的最大值,dp2[u][!v][1]?表示以u为根节点,不遍历以v且不回到u的最大值。其中dp2可以在dp计算出来后,动态的维护一下。

//#pragma comment(linker,"/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<bitset>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define CLR(a,b) memset(a,b,sizeof(a))

#define lson l,m,rt << 1
#define rson m + 1,r,rt << 1 | 1

using namespace std;

const int maxn = 100100;

LL dp[maxn][2],ans[maxn];

vector<pair<int,int> > G[maxn];

int val[maxn];

void dfs(int u,int fa) {
    dp[u][0] = val[u]; dp[u][1] = 0;
    for(int i = 0; i < G[u].size(); i ++) {
        int v = G[u][i].first,c = G[u][i].second;
        if(v == fa) continue;
        dfs(v,u);
        if(dp[v][0] > c * 2) {
            dp[u][0] += dp[v][0] - c * 2;
            dp[u][1] = max(dp[v][1] - dp[v][0] + c,dp[u][1]);
        }
        else dp[u][1] = max(dp[v][1] - c,dp[u][1]);
    }
    dp[u][1] = dp[u][0] + dp[u][1];
}

void dfs2(int u,int fa,LL dp0,LL dp1) {
    LL mx = 0,mx2 = 0,all = val[u];
    for(int i = 0; i < G[u].size(); i ++) {
        int v = G[u][i].first,c = G[u][i].second;
        if(v == fa) {
            if(dp0 - 2 * c > 0) {
                all += dp0 - 2 * c;
                if(dp1 - dp0 + c >= mx) mx2 = mx,mx = dp1 - dp0 + c;
                else if(dp1 - dp0 + c > mx2) mx2 = dp1 - dp0 + c;
            }
            else {
                if(dp1 - c >= mx) mx2 = mx,mx = dp1 - c;
                else if(dp1 - c > mx2) mx2 = dp1 - c;
            }
        }
        else {
            if(dp[v][0] - 2 * c > 0) {
                all += dp[v][0] - 2 * c;
                if(dp[v][1] - dp[v][0] + c >= mx)
                    mx2 = mx,mx = dp[v][1] - dp[v][0] + c;
                else if(dp[v][1] - dp[v][0] + c > mx2)
                    mx2 = dp[v][1] - dp[v][0] + c;
            }
            else {
                if(dp[v][1] - c >= mx)
                    mx2 = mx,mx = dp[v][1] - c;
                else if(dp[v][1] - c > mx2)
                    mx2 = dp[v][1] - c;
            }
        }
    }
    for(int i = 0; i < G[u].size(); i ++) {
        int v = G[u][i].first,c = G[u][i].second;
        if(v == fa) continue;
        LL add = all,tmp = dp[v][1] - c;
        if(dp[v][0] - 2 * c > 0) {
            add -= (dp[v][0] - 2 * c);
            tmp = dp[v][1] - dp[v][0] + c;
        }
        ans[v] = add + dp[v][1] - 2 * c;
        ans[v] = max(ans[v],dp[v][1]);
        if(tmp == mx) {
            ans[v] = max(ans[v],add + mx2 + dp[v][0] - c);
            dfs2(v,u,add,add + mx2);
        }
        else {
            ans[v] = max(ans[v],add + mx + dp[v][0] - c);
            dfs2(v,add + mx);
        }
    }
}

int main() {
    int T,cas = 1,n;
    scanf("%d",&T);
    while(T --) {
        scanf("%d",&n);
        for(int i = 1; i <= n; i ++) {
            scanf("%d",&val[i]);
            G[i].clear();
        }
        for(int i = 1; i < n; i ++) {
            int u,v,c;
            scanf("%d%d%d",&u,&v,&c);
            G[u].push_back(MP(v,c));
            G[v].push_back(MP(u,c));
        }
        dfs(1,-1);
        ans[1] = dp[1][1];
        dfs2(1,-1,0);
        printf("Case #%d:n",cas ++);
        for(int i = 1; i <= n; i ++)
            printf("%I64dn",ans[i]);
    }
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读