#include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef long long ll; typedef pair<int,int> PII; typedef double db; //mt19937 mrand(random_device{}()); const ll mod=1000000007; //int rnd(int x) { return mrand() % x;} ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} int gcd(int a,int b) { return b?gcd(b,a%b):a;} // head const int N=3e2+5; #define INF 0x3f3f3f3f template<class T> inline void read(T &x) { x=0; int c=getchar(),f=1; for (;!isdigit(c);c=getchar()) if (c==45) f=-1; for (;isdigit(c);c=getchar()) (x*=10)+=f*(c-'0'); } int sz[N],n,a[N],_; PII dp[N][N],memo[N]; VI e[N]; void dfs(int u,int f) { sz[u]=1; rep(i,0,SZ(e[u])) { int v=e[u][i]; if (v==f) continue; dfs(v,u); fill(memo,memo+N,mp(INF,INF)); rep(j,0,sz[v]+1) rep(k,1,sz[u]+1) { if (j!=0&&(memo[j+k].fi+memo[j+k].se*memo[j+k].se>dp[u][k].fi+dp[v][j].fi+dp[v][j].se*dp[v][j].se+dp[u][k].se*dp[u][k].se)) memo[j+k]=mp(dp[u][k].fi+dp[v][j].fi+dp[v][j].se*dp[v][j].se,dp[u][k].se);//nieciaglosc if (j!=sz[v]&&(memo[j+k].fi+memo[j+k].se*memo[j+k].se>dp[u][k].fi+dp[v][j+1].fi+(dp[u][k].se+dp[v][j+1].se)*(dp[u][k].se+dp[v][j+1].se))) memo[j+k]=mp(dp[u][k].fi+dp[v][j+1].fi,dp[u][k].se+dp[v][j+1].se);//ciaglosc } sz[u]+=sz[v]; rep(j,1,sz[u]+1) if (memo[j]!=mp(INF,INF)) dp[u][j]=memo[j]; } rep(i,1,sz[u]+1) dp[u][i].se+=a[u]; } int main() { for (read(_);_;_--) { memset(dp,0,sizeof(dp)); read(n); rep(i,0,n) e[i].clear(); rep(i,0,n) read(a[i]); rep(i,0,n-1) { int u,v; read(u); read(v); u--; v--; e[u].pb(v); e[v].pb(u); } dfs(0,-1); rep(i,1,n+1) printf("%d%c",dp[0][i].fi+dp[0][i].se*dp[0][i].se," \n"[i==n]); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef long long ll; typedef pair<int,int> PII; typedef double db; //mt19937 mrand(random_device{}()); const ll mod=1000000007; //int rnd(int x) { return mrand() % x;} ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} int gcd(int a,int b) { return b?gcd(b,a%b):a;} // head const int N=3e2+5; #define INF 0x3f3f3f3f template<class T> inline void read(T &x) { x=0; int c=getchar(),f=1; for (;!isdigit(c);c=getchar()) if (c==45) f=-1; for (;isdigit(c);c=getchar()) (x*=10)+=f*(c-'0'); } int sz[N],n,a[N],_; PII dp[N][N],memo[N]; VI e[N]; void dfs(int u,int f) { sz[u]=1; rep(i,0,SZ(e[u])) { int v=e[u][i]; if (v==f) continue; dfs(v,u); fill(memo,memo+N,mp(INF,INF)); rep(j,0,sz[v]+1) rep(k,1,sz[u]+1) { if (j!=0&&(memo[j+k].fi+memo[j+k].se*memo[j+k].se>dp[u][k].fi+dp[v][j].fi+dp[v][j].se*dp[v][j].se+dp[u][k].se*dp[u][k].se)) memo[j+k]=mp(dp[u][k].fi+dp[v][j].fi+dp[v][j].se*dp[v][j].se,dp[u][k].se);//nieciaglosc if (j!=sz[v]&&(memo[j+k].fi+memo[j+k].se*memo[j+k].se>dp[u][k].fi+dp[v][j+1].fi+(dp[u][k].se+dp[v][j+1].se)*(dp[u][k].se+dp[v][j+1].se))) memo[j+k]=mp(dp[u][k].fi+dp[v][j+1].fi,dp[u][k].se+dp[v][j+1].se);//ciaglosc } sz[u]+=sz[v]; rep(j,1,sz[u]+1) if (memo[j]!=mp(INF,INF)) dp[u][j]=memo[j]; } rep(i,1,sz[u]+1) dp[u][i].se+=a[u]; } int main() { for (read(_);_;_--) { memset(dp,0,sizeof(dp)); read(n); rep(i,0,n) e[i].clear(); rep(i,0,n) read(a[i]); rep(i,0,n-1) { int u,v; read(u); read(v); u--; v--; e[u].pb(v); e[v].pb(u); } dfs(0,-1); rep(i,1,n+1) printf("%d%c",dp[0][i].fi+dp[0][i].se*dp[0][i].se," \n"[i==n]); } } |