BZOJ1827: [Usaco2010 Mar]gather 奶牛大集会

Posted ONION_CYC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ1827: [Usaco2010 Mar]gather 奶牛大集会相关的知识,希望对你有一定的参考价值。

【算法】树型DP

【题解】

两遍DFS,第一次得到所有节点子树的路径和,第二次给出除了该子树外其它部分的路径和,时时计算答案。

long long!!!

技术分享
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define ll long long
using namespace std;
const int maxn=100010;
struct edge{int v,w,from;}e[maxn*2];//边数组开大! 
int first[maxn],tot,size[maxn],n,a[maxn],N;
ll f[maxn],g[maxn],ans;

int read()
{
    char c;int s=0,t=1;
    while(!isdigit(c=getchar()))if(c==-)t=-1;
    do{s=s*10+c-0;}while(isdigit(c=getchar()));
    return s*t;
}
void insert(int u,int v,int w)
{tot++;e[tot].v=v;e[tot].w=w;e[tot].from=first[u];first[u]=tot;}
void dfs1(int x,int fa){
    f[x]=0;size[x]=a[x];
    for(int i=first[x];i;i=e[i].from)if(e[i].v!=fa){
        dfs1(e[i].v,x);
        size[x]+=size[e[i].v];
        g[e[i].v]=f[e[i].v]+1ll*size[e[i].v]*e[i].w;
        f[x]+=g[e[i].v];
    }
}
void dfs2(int x,int fa,ll num){
    ans=min(ans,num+f[x]);
    for(int i=first[x];i;i=e[i].from)if(e[i].v!=fa){
        dfs2(e[i].v,x,num+f[x]-g[e[i].v]+1ll*(N-size[e[i].v])*e[i].w);
    }
}
    
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)a[i]=read(),N+=a[i];
    int u,v,w;
    for(int i=1;i<n;i++){
        u=read();v=read();w=read();
        insert(u,v,w);insert(v,u,w);
    }
    dfs1(1,-1);
    ans=(1ll<<60);
    dfs2(1,-1,0);
    printf("%lld",ans);
    return 0;
}
View Code

 

以上是关于BZOJ1827: [Usaco2010 Mar]gather 奶牛大集会的主要内容,如果未能解决你的问题,请参考以下文章

嘴巴题4 「BZOJ1827」[Usaco2010 Mar] gather 奶牛大集会

BZOJ 1827 [Usaco2010 Mar]gather 奶牛大集会(树形DP)

BZOJ1827 [Usaco2010 Mar]gather 奶牛大集会

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

BZOJ_1828_[Usaco2010 Mar]balloc 农场分配_线段树

bzoj1597USACO 2008 Mar土地购买