[模板]
求树的重心
[任务]
求树的重心
[接口]
vector<edge> way[maxn] 无向图
int siz[] 该节点的子节点个数(包括自己)
int mu[] 该节点的(最大,节点数最多)子树的节点数
allnode 根节点的子节点个数 = siz(root)
int getroot(int u,int fa) 返回以u为根节点的子树的重心,fa为u的父节点(防止回去);
void dfsize(int u,int fa) 创建siz数组和mu数组(以u为根节点)
void dfsroot(int u,int fa,int allnode,int &root) 通过之前创建的siz数组和mu数组得到重心.(allnode = siz[u])
[代码]
void dfsize(int u,int fa)
{
siz[u] = 1;
mu[u] = 0;
for(int i=0;i<way[u].size();i++)
{
int t = way[u][i].to;
if(t == fa || vis[t] ) continue;
dfsize(t,u);
siz[u] += siz[t];
mu[u] = max(mu[u],siz[t]);
}
}
void dfsroot(int u,int fa,int allnode,int &root)
{
mu[u] = max(mu[u],allnode - siz[u]);
if(mu[u] < mu[root]) root = u;
for(int i=0;i<way[u].size();i++)
{
int t = way[u][i].to;
if(t!=fa && !vis[t]) dfsroot(t,u,allnode,root);
}
}
int getroot(int u,int fa)
{
int root = 0;
dfsize(u,fa);
dfsroot(u,fa,siz[u],root);
return root;
}
[模板]树的重心
最新推荐文章于 2019-03-11 13:26:08 发布