E - Equal Tree Sums
分析:
-
神仙思维+树上问题+结论
如果没有 a i ! = 0 a_i!=0 ai!=0的条件,直接全取0就是
现在有这个条件,想办法往这个条件构造
考虑树上的任意一条边的两个端点,往0靠,则正负取,即黑白染色
-
每个点的权值取其度数
这样就能保证这一整颗树(无根树)的权值为0,任意去掉一个“根节点”
- 若根为正:则剩下的子树的权值和都是为-1
- 若根伟负:则剩下的子树的权值和都是为1
#include <bits/stdc++.h>
#define int long long
#define Pa pair<int,int>
using namespace std;
const int N=2e5+5;
int a[N],b[100005];
vector <int> g[N];
int ans[N];
void dfs(int u,int fa,int fg)
{
ans[u]=fg*g[u].size();
for(int v : g[u])
{
if(v==fa) continue;
dfs(v,u,-fg);
}
}
void solve()
{
int n,k;
scanf("%lld",&n);
for(int i=1;i<=n;i++) g[i].clear();
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,-1,1);
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
cout<<"\n";
}
signed main()
{
int T=1;
cin>>T;
while(T--) solve();
}