首页 > 其他分享 >P2986 [USACO10MAR] Great Cow Gathering G

P2986 [USACO10MAR] Great Cow Gathering G

时间:2024-02-07 23:22:32浏览次数:36  
标签:Gathering ll 节点 100005 为根 答案 now P2986 USACO10MAR

原题链接

题解

很简单想到暴力,但是 \(O(n^2)\) 显然不行
所以要减少计算量,如何利用已经计算过的值而不是重新算一遍呢?
这道题最好看成有中心点的网状图,而不是树状图

随便取一个点 \(A\) 作为根节点,很容易计算其答案,如何计算以其他点为根节点的答案呢?
对于以根节点的邻边节点 \(B\) 为根节点的图,其答案相当于原本 \(A\) 点的答案加上 \(A\) 点的所有奶牛迁移到 \(B\) 点的消耗,又因为以 \(B\) 节点为根节点的子树(相对于 \(A\) 来说)重复走了两段
所以减去这个重复的两端就是 \(B\) 点的答案
如果这个过程以 有中心点的网状图 来看很容易理解

Code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct edge
{
    ll to,val;
};
vector<edge> G[100005];
ll c[100005]={0};
ll sum1[100005]={0},ans1[100005]={0};
ll ans[100005]={0};
ll total=0;
void ss(ll now,ll fa)
{
    sum1[now]=c[now];
    for(ll i=0;i<G[now].size();i++)
    {
        ll next=G[now][i].to,len=G[now][i].val;
        if(next==fa)continue;

        ss(next,now);
        ans1[now]+=sum1[next]*len+ans1[next];
        sum1[now]+=sum1[next];
    }
}

void turn(ll now,ll fa)
{
    for(ll i=0;i<G[now].size();i++)
    {
        ll next=G[now][i].to,len=G[now][i].val;
        if(next==fa)continue;

        ans[next]=(total-2*sum1[next])*len+ans[now];
        turn(next,now);
    }
}

int main()
{
    ll n;
    cin>>n;
    for(ll i=1;i<=n;i++)
    {
        cin>>c[i];
        total+=c[i];
    }

    for(ll i=1;i<=n-1;i++)
    {
        ll x,y,l;
        cin>>x>>y>>l;
        G[x].push_back({y,l});
        G[y].push_back({x,l});
    }

    ss(1,0);
    ans[1]=ans1[1];
    turn(1,0);

    ll sum=2e18;
    for(ll i=1;i<=n;i++)
    {
        //cout<<ans[i]<<endl;
        sum=min(sum,ans[i]);
    }
    cout<<sum<<endl;
    return 0;
}

标签:Gathering,ll,节点,100005,为根,答案,now,P2986,USACO10MAR
From: https://www.cnblogs.com/pure4knowledge/p/18011468

相关文章

  • Great Cow Gathering G
    GreatCowGatheringG思路换根dp,TreeDistancesI强化版,同样的先思考单个的,那么对于子树\(u\)对于每一个儿子\(v\)都有:\(f_u=f_v+sum_v*w_{u,v}\)其中\(sum\)是子树大小,而\(w\)则是边的长度,用这种方式可以求出以1为根的答案,然后考虑换根公式,首先要转移到的节点......
  • P1937 [USACO10MAR]Barn Allocation G
    BarnAllocationG题目描述农夫约翰最近开了一个新的牲口棚屋,并且现在接受来自奶牛的分配畜栏请求因为其中的一些畜栏有更好风景。畜栏包括N个畜栏(1≤N≤100,000),方便起见,我们把它们编号为1..N,畜栏i能容纳Ci只牛(1≤Ci≤100,000),第i只牛需要连续编号畜栏(从Ai到Bi)来漫......
  • Information Gathering - Identifying Website Technologies
    InformationGathering-IdentifyingWebsiteTechnologiesByOnlineWebsiteshttps://builtwith.comByBrowserExtensionsWappalyzerByOpenSourceToolswhatwebinkaliwhatweburlTips:在GitHub上有很多由python编写指纹识别工具......
  • Information Gathering - SubDomains Finding
    SubDomainsFindingByOnlineWebsiteshttps://crt.sh/crt.sh通过证书记录查询子域名,%为通配符ByOpensourceToolssublist3r安装在kali中使用aptinstallsublist3r即可安装,或在githubhttps://github.com/aboul3la/Sublist3r下载运行apt安装直接输入sublist3r......
  • P2986 Great Cow Gathering G
     换根dp,father->son ,基本是加减 #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+2,M=N*5;#defineintlonglongintn,a[N],sz[N],g[N],f[N],S;intnxt[M],go[M],w[M],hd[N],all;voidadd(intx,inty,intz){ go[++all]=y,nxt[a......
  • NC24734 [USACO 2010 Mar G]Great Cow Gathering
    题目链接题目题目描述BessieisplanningtheannualGreatCowGatheringforcowsallacrossthecountryand,ofcourse,shewouldliketochoosethemostconv......