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

[USACO10MAR] 伟大的奶牛聚集 - 树形dp

时间:2020-02-05 18:24:46      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:second   dfs   pre   class   push   its   sig   false   i++   

每个点有重数,求到所有点距离最小的点

就是魔改的重心了

#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 1000005;

vector <pair<int,int> > g[N];
int siz[N],f[N],vis[N],sum[N],c[N],n,m,t1,t2,t3,tot;

void dfs1(int p) {
    vis[p]=1;
    siz[p]=c[p];
    for(int i=0;i<g[p].size();i++) {
        int q=g[p][i].first, w=g[p][i].second;
        if(vis[q]==0) {
            dfs1(q);
            sum[p]+=sum[q]+siz[q]*w;
            siz[p]+=siz[q];
        }
    }
}

void dfs2(int p) {
    vis[p]=1;
    for(int i=0;i<g[p].size();i++) {
        int q=g[p][i].first, w=g[p][i].second;
        if(vis[q]==0) {
            f[q] = f[p] - siz[q]*w + (tot-siz[q])*w;
            dfs2(q);
        }
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>c[i], tot+=c[i];
    for(int i=1;i<n;i++) {
        cin>>t1>>t2>>t3;
        g[t1].push_back(make_pair(t2,t3));
        g[t2].push_back(make_pair(t1,t3));
    }
    dfs1(1);
    memset(vis,0,sizeof vis);
    f[1]=sum[1];
    dfs2(1);
    int ans = 1e+18;
    for(int i=1;i<=n;i++) {
        ans = min(ans, f[i]);
    }
    cout<<ans<<endl;
}

[USACO10MAR] 伟大的奶牛聚集 - 树形dp

标签:second   dfs   pre   class   push   its   sig   false   i++   

原文地址:https://www.cnblogs.com/mollnn/p/12264634.html

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