树分治

来源:互联网 发布:数据分析的方法 编辑:程序博客网 时间:2024/06/05 03:02
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]);    }}
原创粉丝点击