1 条题解
-
0
自动搬运
来自洛谷,原作者为

YoungLove
**搬运于
2025-08-24 21:54:03,当前版本为作者最后更新于2017-10-21 21:31:23,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
如果存在能将一棵树分成若干个大小为的联通块的方案数,那么每一个联通块都有一定是一棵子树,且分割方案是唯一的,因此我们队这棵树进行深搜,并同时记录子树大小,如果当前大小恰好为的话,就将该子树大小记录为0,相当于剪去这一部分。最后只要判断剪掉的部分时候等于就可以了。
代码在这里
# include <algorithm> # include <iostream> # include <cstring> # include <cstdio> # include <queue> # include <cmath> # define R register # define LL long long using namespace std; int n,k,e,h[100010],x,y,T,siz[100010],tot; struct zx{int v,pre;}ed[200010]; template <typename T> void in(R T& a){ R char c = getchar();R T x=0,f=1; while(!isdigit(c)) {if(c == '-') f = -1; c = getchar();} while(isdigit(c)) x = (x<<1)+(x<<3)+c-'0',c = getchar(); a = x*f; } inline void add(R int x,R int y){ ed[++e] = (zx){y,h[x]}; h[x] = e; } inline void dfs(R int x,R int fa){ siz[x] = 1; for(R int i=h[x]; i; i=ed[i].pre){ R int p = ed[i].v; if(p == fa) continue; dfs(p,x); siz[x] += siz[p]; } if(siz[x]==k) tot++,siz[x] -= k; } int main(){ // freopen("sample.in","r",stdin); // freopen("sample.out","w",stdout); in(T); while(T--) { in(n),in(k); e=tot=0; memset(siz,0,sizeof(siz)); memset(h,0,sizeof(h)); for(R int i=1; i<n; ++i) { in(x),in(y); add(x,y); add(y,x); } if(n%k != 0) {printf("NO\n");continue;} dfs(1,-1); if(tot == n/k) printf("YES\n"); else printf("NO\n"); } }另外
臭不要脸的推广一下我的博客Youngsc;
- 1
信息
- ID
- 2872
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者