#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
vector < int > Next[100005];
int what[100005];
int Ans[1000005];
int con[1000005];
int sz[1000005];
int ans=0,now,N,nn;
bool have[1000005];
int xx,yy,root;
void DFS(int st,int here,int fa,int deg)
{
if(st!=here) if(what[here]==what[st]) now=min(now,deg);
for(auto i:Next[here])
{
if(i!=fa)
{
DFS(st,i,here,deg+1);
}
}
}
void F(int here)
{
int t,i;
if(here==N+1)
{
t=0;
for(i=1;i<=N;i++)
{
now=2e9;
DFS(i,i,-1,0);
t=max(t,now);
}
ans=min(ans,t);
if(t==ans) for(i=1;i<=N;i++) Ans[i]=what[i];
}
else
{
if(what[here]==-1)
{
what[here]=1;
F(here+1);
what[here]=0;
F(here+1);
what[here]=-1;
}
else F(here+1);
}
}
int DFS2(int here,int fa)
{
sz[here]=1;
for(auto i:Next[here])
{
if(!have[i]&&i!=fa)
{
sz[here]+=DFS2(i,here);
}
}
return sz[here];
}
void DFS3(int here,int fa)
{
int t=nn-sz[here];
for(auto i:Next[here])
{
if(!have[i]&&i!=fa)
{
DFS3(i,here);
t=max(t,sz[i]);
}
}
if(t<=nn/2) root=here;
}
void DFS4(int here,int fa,int deg)
{
if(what[here]==0) xx=min(xx,deg);
if(what[here]==1) yy=min(yy,deg);
for(auto i:Next[here])
{
if(!have[i]&&i!=fa)
{
DFS4(i,here,deg+1);
}
}
}
void DFS5(int here,int fa,int deg)
{
if(what[here]==0) con[here]=min(con[here],deg+xx);
if(what[here]==1) con[here]=min(con[here],deg+yy);
for(auto i:Next[here])
{
if(!have[i]&&i!=fa)
{
DFS5(i,here,deg+1);
}
}
}
void F2(int here)
{
DFS2(here,-1);
nn=sz[here];
DFS3(here,-1);
xx=2e9;
yy=2e9;
DFS4(root,-1,0);
DFS5(root,-1,0);
have[root]=1;
for(auto i:Next[root]) if(!have[i]) F2(i);
}
int main()
{
int T,M,i,x=0,y=0,ok;
scanf("%d",&T);
while(T--)
{
ok=0;
ans=2e9;
scanf("%d",&N);
for(i=1;i<=N;i++) Next[i].clear();
for(i=1;i<N;i++)
{
scanf("%d %d",&x,&y);
Next[x].push_back(y);
Next[y].push_back(x);
}
for(i=1;i<=N;i++)
{
scanf("%d",&what[i]);
if(what[i]==-1) ok=1;
}
if(ok)
{
F(1);
if(ans==2000000000) printf("-1\n");
else
{
printf("%d\n",ans);
for(i=1;i<=N;i++) printf("%d ",Ans[i]);
printf("\n");
}
}
else
{
x=0;
y=0;
for(i=1;i<=N;i++)
{
have[i]=0;
con[i]=2e9;
if(what[i]==1) x++;
else y++;
}
if(x==1||y==1) printf("-1\n");
else
{
ans=0;
F2(1);
for(i=1;i<=N;i++) ans=max(ans,con[i]);
printf("%d\n",ans);
for(i=1;i<=N;i++) printf("%d ",what[i]);
printf("\n");
}
}
}
return 0;
}
Compilation message
balancedtree.cpp: In function 'int main()':
balancedtree.cpp:121:11: warning: unused variable 'M' [-Wunused-variable]
121 | int T,M,i,x=0,y=0,ok;
| ^
balancedtree.cpp:122:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
122 | scanf("%d",&T);
| ~~~~~^~~~~~~~~
balancedtree.cpp:127:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
127 | scanf("%d",&N);
| ~~~~~^~~~~~~~~
balancedtree.cpp:131:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
131 | scanf("%d %d",&x,&y);
| ~~~~~^~~~~~~~~~~~~~~
balancedtree.cpp:137:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
137 | scanf("%d",&what[i]);
| ~~~~~^~~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
13 ms |
2688 KB |
Output isn't correct |
2 |
Incorrect |
28 ms |
2688 KB |
Output isn't correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
79 ms |
2936 KB |
Output isn't correct |
2 |
Incorrect |
237 ms |
5240 KB |
Output isn't correct |
3 |
Incorrect |
141 ms |
3448 KB |
Output isn't correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
4024 ms |
2688 KB |
Time limit exceeded |
2 |
Execution timed out |
4034 ms |
12792 KB |
Time limit exceeded |
3 |
Execution timed out |
4053 ms |
6528 KB |
Time limit exceeded |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
4043 ms |
3456 KB |
Time limit exceeded |
2 |
Execution timed out |
4025 ms |
2688 KB |
Time limit exceeded |
3 |
Execution timed out |
4043 ms |
2816 KB |
Time limit exceeded |
4 |
Execution timed out |
4040 ms |
2688 KB |
Time limit exceeded |
5 |
Execution timed out |
4022 ms |
2688 KB |
Time limit exceeded |
6 |
Execution timed out |
4029 ms |
3192 KB |
Time limit exceeded |
7 |
Execution timed out |
4029 ms |
2688 KB |
Time limit exceeded |
8 |
Execution timed out |
4035 ms |
2688 KB |
Time limit exceeded |
9 |
Execution timed out |
4025 ms |
2688 KB |
Time limit exceeded |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
13 ms |
2688 KB |
Output isn't correct |
2 |
Incorrect |
28 ms |
2688 KB |
Output isn't correct |
3 |
Incorrect |
79 ms |
2936 KB |
Output isn't correct |
4 |
Incorrect |
237 ms |
5240 KB |
Output isn't correct |
5 |
Incorrect |
141 ms |
3448 KB |
Output isn't correct |
6 |
Execution timed out |
4024 ms |
2688 KB |
Time limit exceeded |
7 |
Execution timed out |
4034 ms |
12792 KB |
Time limit exceeded |
8 |
Execution timed out |
4053 ms |
6528 KB |
Time limit exceeded |
9 |
Execution timed out |
4043 ms |
3456 KB |
Time limit exceeded |
10 |
Execution timed out |
4025 ms |
2688 KB |
Time limit exceeded |
11 |
Execution timed out |
4043 ms |
2816 KB |
Time limit exceeded |
12 |
Execution timed out |
4040 ms |
2688 KB |
Time limit exceeded |
13 |
Execution timed out |
4022 ms |
2688 KB |
Time limit exceeded |
14 |
Execution timed out |
4029 ms |
3192 KB |
Time limit exceeded |
15 |
Execution timed out |
4029 ms |
2688 KB |
Time limit exceeded |
16 |
Execution timed out |
4035 ms |
2688 KB |
Time limit exceeded |
17 |
Execution timed out |
4025 ms |
2688 KB |
Time limit exceeded |
18 |
Execution timed out |
4021 ms |
3192 KB |
Time limit exceeded |
19 |
Execution timed out |
4024 ms |
6648 KB |
Time limit exceeded |
20 |
Execution timed out |
4043 ms |
2688 KB |
Time limit exceeded |
21 |
Runtime error |
6 ms |
5248 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
22 |
Execution timed out |
4029 ms |
2688 KB |
Time limit exceeded |