Pagini recente » Cod sursa (job #1193621) | Cod sursa (job #1455222) | Cod sursa (job #2250065) | Cod sursa (job #1635419) | Cod sursa (job #1910354)
#include <bits/stdc++.h>
#define maxN 100005
using namespace std;
const int INF=0x3f3f3f3f;
vector<int> v[maxN];
int val[maxN],bst[maxN],ap[maxN],nxt[maxN],_size[maxN];
unordered_map<int,int> Map[maxN];
int n,m,i,j,x,y;
void dfs(int nod,int tata)
{
_size[nod]=1; /* size of the subtree */
vector<int> sons;
int bestson=0,maxx=-INF;
for(auto &it:v[nod])
if(it!=tata)
{
dfs(it,nod);
sons.push_back(it);
_size[nod]+=_size[it];
if(_size[it]>_size[bestson]) /* largest subtree */
bestson=it,maxx=_size[it];
}
if(maxx==-INF){ /* current node is leaf */
bst[nod]=val[nod];
ap[nod]=1;
Map[nod][val[nod]]=1;
nxt[nod]=nod;
}
else
{
nxt[nod]=nxt[bestson];
bst[nod]=bst[bestson];
ap[nod]=ap[bestson];
int act=nxt[bestson];
for(auto itr:sons)
if(itr!=bestson)
for(auto col:Map[nxt[itr]])
{
int color=col.first;
Map[act][color]+=col.second;
if(Map[act][color]>ap[nod] || (Map[act][color]==ap[nod] && color<bst[nod])) /* updating node solution */
bst[nod]=color,ap[nod]=Map[act][color];
}
int color=val[nod]; /* adding current node's color */
Map[act][color]++;
if(Map[act][color]>ap[nod] || (Map[act][color]==ap[nod] && color<bst[nod]))
bst[nod]=color,ap[nod]=Map[act][color];
}
}
int main()
{
freopen("egal.in","r",stdin);
freopen("egal.out","w",stdout);
scanf("%d",&n);
for(i=1;i<n;i++)
scanf("%d %d",&x,&y),
v[x].push_back(y),
v[y].push_back(x);
for(i=1;i<=n;i++)
scanf("%d ",&val[i]);
dfs(1,0);
for(i=1;i<=n;i++)
printf("%d %d\n",bst[i],ap[i]);
return 0;
}