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

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

就是魔改的重心了

#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;
}

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

时间: 2024-11-09 02:57:47

[USACO10MAR] 伟大的奶牛聚集 - 树形dp的相关文章

题解 P2986 [USACO10MAR]伟大的奶牛聚集

题解 P2986 [USACO10MAR]伟大的奶牛聚集 题目链接 很好的一道树形dp的题目,我们观察每一个点i的答案,发现答案 f[i] 由两部分组成: A1.i所有子树中的犇集中到i点 A2.除了i的子树中的所有犇集中到i的父亲节点,再走到i点 f[i] = A1 + A2 我们发现i的答案和i的孩子有关,也和i的父亲有关.一般这样的问题用两次dfs就可以解决.(由于选谁是根节点都无所谓,以下以1号节点为根) 第一次dfs我们求出每一个点的 f[i], 意思是以i为根节点的子树中的牛集中到i

[USACO10MAR]伟大的奶牛聚集

[USACO10MAR]伟大的奶牛聚集 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会. 每个奶牛居住在 N(1<=N<=100,000) 个农场中的一个,这些农场由N-1条道路连接,并且从任意一个农场都能够到达另外一个农场.道路i连接农场A_i和B_i(1 <= A_i <=N; 1 <= B_i <= N),长度为L_i(1 <= L_i <= 1,000).集会可以在N个农场中的

洛谷 P2986 [USACO10MAR]伟大的奶牛聚集(树形动规)

题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of course, she would like to choose the most convenient location for the gathering to take place. Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会

P2986 [USACO10MAR]伟大的奶牛聚集(思维,dp)

题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of course, she would like to choose the most convenient location for the gathering to take place. Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会

BZOJ 1827 洛谷 2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gather

[题解] 很容易想到暴力做法,枚举每个点,然后对于每个点O(N)遍历整棵树计算答案.这样整个效率是O(N^2)的,显然不行. 我们考虑如果已知当前某个点的答案,如何快速计算它的儿子的答案. 显然选择它的儿子作为集合点,它的儿子的子树内的奶牛可以少走当前点到儿子节点的距离dis,不在它儿子的子树内的奶牛要多走dis. 那么我们维护每个节点的子树内的奶牛总数(即点权和),就可以快速进行计算了.效率O(N). 1 #include<cstdio> 2 #include<algorithm>

P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…

题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of course, she would like to choose the most convenient location for the gathering to take place. Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会

P2986 [USACO10MAR]伟大的奶牛聚集

题意: 给一棵 n 个点的边 + 点权树,求带权重? 思路: 其实这题和之前那个 Sta 有点像,我们同样只需要预处理出一个 f[u] 代表以 u 为集合点的方便程度,那么我们就可以O(1)的转移了 假设 v 是 u 的儿子,f[v] = f[u] - (siz[v] * len) + (n - siz[v] ) * len = f[u] + (n - 2 * siz[v] )  * len 这题有一个坑,就是你的INF得开的特别大,不然你就没有 100 了 #include <iostream

洛谷 P2986 [USACO10MAR]Great Cow Gat…(树形dp+容斥原理)

P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat… 题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of course, she would like to choose the most convenient location for the gathering to take place. Each cow lives in on

BZOJ 1596--电话网络(树形DP)

1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1139  Solved: 534[Submit][Status][Discuss] Description Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来保证任意两块草地间都存在手机信号.所有的N块草地按1..N 顺