1 条题解

  • 0
    @ 2026-4-3 15:42:48
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define PII pair<int,int>
    #define fi first
    #define se second
    const int N=3e5+10;
    vector<PII>G[N];
    int dp[N][2],a[N];
    void dfs(int x,int f)
    {
    	vector<int>res;int sum=0;
    	for(auto i:G[x])if(i.fi!=f)
    	{
    		int y=i.fi,w=i.se;
    		dfs(y,x);
    		sum+=dp[y][0];
    		if(a[y])res.push_back(max(0ll,dp[y][1]+w-dp[y][0]));
    		else res.push_back(0);
    	}
    	sort(res.begin(),res.end(),[](int x,int y){return x>y;});
    	int sum1=0,siz1=0;dp[x][0]=dp[x][1]=sum;
    	for(int y:res)
    	{
    		siz1++;sum1+=y;
    		if(siz1<=a[x]-1)dp[x][1]=max(dp[x][1],sum1+sum);
    		if(siz1<=a[x])dp[x][0]=max(dp[x][0],sum1+sum);
    	}
    }
    signed main()
    {
    	int n;cin>>n;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	for(int i=1;i<n;i++)
    	{
    		int x,y,c;cin>>x>>y>>c;
    		G[x].push_back({y,c});
    		G[y].push_back({x,c});
    	}
    	dfs(1,0);
    	cout<<dp[1][0];
    	return 0;
    }
    • 1

    信息

    ID
    10055
    时间
    3000ms
    内存
    1024MiB
    难度
    6
    标签
    递交数
    41
    已通过
    12
    上传者