int tot,rt,mx,cnt,n,up;
int first[N],vis[N],sz[N],w[N];
void init(int n)
{
tot=0;ans=0;
for(int i=0;i<=n;i++)
{
vis[i]=0;
first[i]=-1;
}
}
void dfs1(int u,int fa)
{
int maxv=1;
sz[u]=1;
for(int i=first[u];i!=-1;i=edge[i].next)
{
int v=edge[i].e;
if(v==fa||vis[v]) continue;
dfs1(v,u);
sz[u]+=sz[v];
maxv=max(maxv,sz[v]);
}
maxv=max(maxv,sz[0]-sz[u]);
if(maxv<mx) mx=maxv,rt=u;
}
void dfs2(int u,int fa)
{
sz[u]=1;
for(int i=first[u];i!=-1;i=edge[i].next)
{
int v=edge[i].e;
if(v==fa||vis[v]) continue;
dfs2(v,u);
sz[u]+=sz[v];
}
}
LL solve(int u)
{
}
void dfs(int u,int num)
{
sz[0]=num;
mx=INF;
dfs1(u,-1);//get_root
vis[rt]=1;
ans+=solve(rt);
for(int i=first[rt];i!=-1;i=edge[i].next)
{
int v=edge[i].e;
if(vis[v]) continue;
ans-=solve(v);
}
for(int i=first[rt];i!=-1;i=edge[i].next)
{
int v=edge[i].e;
if(vis[v]) continue;
dfs(v,sz[v]);
}
}
树分治
最新推荐文章于 2024-12-26 15:04:08 发布
1017

被折叠的 条评论
为什么被折叠?



