(先看看我丑陋的程序)
void dfs1(int u, int fa){
int bottom =top;
edge E;
for(int l =first[u]; l; l =E.net){
E =e[l];
if(E.to != fa){
dfs1(E.to, u);
if(top-bottom >= S){
++totk;
while(top != bottom) chunk[stk[--top]] =totk;
prov_cap[totk] =u;
}
}
}
stk[top++] =u;
}
其他地方不要管,注译的入栈代码如果放在开头的话,分的块大概是这样:

如果放在结尾,橙色部分就不可能出现。
仅仅是分块或许没问题,但这题的判省会操作若放在 dfs 中间直接判的话第一种分块就会有问题(硬要说额外搜一次再判也太麻烦...)
以上。