7.20日

发布时间 2023-07-20 14:06:08作者: 临江柔

一、写了杭州电子科技大学的铜牌题,学了树形dp;

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define endl '\n'
#define pq priority_queue
using namespace std;
typedef pair<int,int> pii;

vector<int>e[400010];
int a[400010];
int dp[400010][3];//父亲,自己,儿子

void dfs(int u,int fu)
{
    dp[u][1]=a[u];
    int sum=0;
    for(auto t:e[u])
    {
        if(t==fu)continue;
        dfs(t,u);
        dp[u][1]+=min(min(dp[t][1],dp[t][2]),dp[t][0]);
        dp[u][0]+=min(dp[t][1],dp[t][2]);
        sum+=min(dp[t][1],dp[t][2]);
    }
    dp[u][2]=1e18;
    for(auto t:e[u])
    {
        dp[u][2]=min(dp[u][2],sum-min(dp[t][1],dp[t][2])+dp[t][1]);
    }
}

void solve()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i],dp[i][1]=dp[i][2]=dp[i][3]=0,e[i].clear();
    for(int i=1;i<n;i++)
    {
        int x,y;cin>>x>>y;
        e[x].push_back(y);
        e[y].push_back(x);
    }
    dfs(1,-1);
    cout<<min(dp[1][1],dp[1][2])<<endl;
}

signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t;cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

 

二、刷科一题,明天考试。

三、看杭州电子科技大学二场多校,还有睿抗题解,整理错题。

四、有时间再学前端。

五、明天科一考试,下午牛客多校训练营,晚上打codeforces的div4竞赛。