Ciel the Commander(树的重心,分治)
Posted thusloop
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ciel the Commander(树的重心,分治)相关的知识,希望对你有一定的参考价值。
传送门
每次找树的重心,涂色为当前最大可涂的字母
#include<bits/stdc++.h>
#define int long long
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf=2e18+100;
const int maxn=2e5+100;
vector<int>g[maxn];
int sum;
bool vis[maxn];
int son[maxn];
int res,root;
bool fg=1;
char col[maxn];
void getroot(int x,int fa)
{
son[x]=1;
int mx=0;
for(auto it:g[x])
{
if(it==fa||vis[it])continue;
getroot(it,x);
son[x]+=son[it];
mx=max(mx,son[it]);
}
mx=max(mx,sum-son[x]);
if(mx<res)
{
res=mx;
root=x;
}
}
void dfs(int x,int dep)
{
if(dep>=26)
{
fg=0;
return ;
}
col[x]='A'+dep;
vis[x]=1;
for(auto it:g[x])
{
if(fg==0)return;
if(vis[it])continue;
res=inf;root=0;sum=son[it];
getroot(it,-1);
dfs(root,dep+1);
if(fg==0)return;
}
}
signed main()
{
IOS
int n;
cin>>n;
sum=n;
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
res=inf;
getroot(1,-1);
dfs(root,0);
if(fg==0)
{
cout<<"Impossible"<<"\\n";
}
else
{
for(int i=1;i<=n;i++)
{
cout<<col[i]<<" ";
}
cout<<"\\n";
}
}
以上是关于Ciel the Commander(树的重心,分治)的主要内容,如果未能解决你的问题,请参考以下文章