https://codeforces.com/contest/1656/problem/E
给每个顶点分配值,使得删除一个点后,剩下的各个连通块的权值和相等
黑白染色问题,黑的为负,白的为正,绝对值等于自己的度数,这样如果删除一个点后剩下的连通块的和要么全为1或全为-1
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+25;
typedef long long ll;
int vis[maxn];
int q[maxn];
vector<int> g[maxn];
int n;
void dfs(int i,int f)
{ vis[i]=1;
q[i]=f*g[i].size();
for(int j=0;j<g[i].size();j++)
{
if(!vis[g[i][j]])
{
dfs(g[i][j],-f);
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{ memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
g[i].clear();
}
for(int i=1;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,1);
for(int i=1;i<=n;i++)
printf("%d ",q[i]);
printf("\n");
}
}