核心代码喽~~
int df[maxn],idnew[maxn],son[maxn],fa[maxn],top[maxn],siz[maxn],depth[maxn],head[maxn],cnt1,cnt;
struct edge{
int w,nx,to;
}edge[maxn];
void add(int u,int v){
edge[++cnt].to=v;
edge[cnt].nx=head[u];
head[u]=cnt;
}
void dfs1(int u,int fa)//找到重儿子,以及没棵子树的结点大小
{
siz[u]=1;fa[u]=fa;
for(int i=head[u];i;i=edge[i].nx){
int v=edge[i].to;
if(u!=fa){
depth[v]=depth[u]+1;
dfs(v,u);
siz[u]+=siz[v];
if(siz[v]>siz[son[u]) son[u]=v;
}
}
}
void dfs2(int u,int t){
top[u]=t;//重链顶端
df[u]=++cnt1;//dfs序
idnew[cnt1]=u;//该dfs序代表的结点
if(!son[u]) return;
dfs2(son[u],t);
for(int i=head[u];i;i=edge[i].nx){
int v=edge[i].to;
if(v!=son[u]&&v!=fa[u])
dfs2(v,v);
}
}
#include
#include
#include
#include<set>
#include
#include
#include