Hey guys I just tried the Anton and Tree problem , hope you might like my solution feel free to comment better solution .
#include<stdio.h>
#include<stdlib.h>
typedef unsigned u;
u D[222222],C[222222],B[222222],A[222222],I;
u F(u x){if(D[x]!=x)return D[x]=F(D[x]);return x;}
u *G[222222],Ga[222222],Gi[222222];
void add(u i,u j)
{
if(Ga[i]==Gi[i])
{
if(!Ga[i])G[i]=(u*)calloc(Ga[i]=1,sizeof(u));
else G[i]=(u*)realloc(G[i],(Ga[i]<<=1)*sizeof(u));
}
G[i][Gi[i]++]=j;
return;
}
u X[222222],Y[222222],*P,*Q,*R,Z[222222];
int main()
{
u n,i=0,j,k,p,q,r=0;
for(scanf(“%u”,&n);++i<=n;D[i]=i)scanf(“%u”,C+i);
for(k=n;–k;)
{
scanf(“%u%u”,&i,&j);
i=F(i);j=F(j);
if(i>j){q=i;i=j;j=q;}
if(C[i]!=C[j]){A[I]=i;B[I++]=j;}
else{D[j]=i;}
}
for(k=-1;++k<I;)
{
i=F(A[k]);j=F(B[k]);
add(i,j);add(j,i);
++Z[i];++Z[j];
}
for(q=i=0;++i<=n;)if(Z[i]==1)X[q++]=i;
for(P=X,Q=Y;(p=q);)
{
r+=1+(p>1);
for(q=0;p–;)
{
for(i=Gi[k=P[p]];i–;)
if(–Z[j=G[k][i]]==1)Q[q++]=j;
}
R=P;P=Q;Q=R;
}
printf(“%u\n”,r>>1);
return 0;
}