uoj387题解 Posted on 2018-07-15 | Edited on 2019-09-09 | Comments: 学到了一个新的技巧,树形的依赖关系,把顺序翻转,就可以在依赖父亲和依赖子树之间相互转化. 每次选取最深的能选取的叶子,证明的话,画个图用一下调整法应该能证. 代码: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>#define ele int#define fi first#define se secondusing namespace std;#define maxn 100010ele n,m,ans,f[maxn],dep[maxn],deg[maxn];vector<ele> res[maxn];priority_queue<pair<ele,ele> > Q;queue<ele> Q1;int main(){ scanf("%d%d",&n,&m); dep[0]=0; memset(deg,0,sizeof(deg)); for (int i=1; i<n; ++i){ scanf("%d",f+i); --f[i]; ++deg[f[i]]; dep[i]=dep[f[i]]+1; } for (int i=0; i<n; ++i) if (!deg[i]) Q.push(make_pair(dep[i],i)); ans=0; for (int i=0; i<n; ++i){ if (Q.empty()){ ++ans; while (!Q1.empty()){ ele k=Q1.front(); Q1.pop(); Q.push(make_pair(dep[k],k)); } } pair<ele,ele> k1=Q.top(); Q.pop(); ele k=k1.se; if (res[ans].size()==m){ ++ans; while (!Q1.empty()){ ele k=Q1.front(); Q1.pop(); Q.push(make_pair(dep[k],k)); } } res[ans].push_back(k); --deg[f[k]]; if (!deg[f[k]]) Q1.push(f[k]); } printf("%d\n",ans+1); for (int i=ans; ~i; --i){ printf("%d ",res[i].size()); for (int j=res[i].size()-1; ~j; --j) printf("%d ",res[i][j]+1); puts(""); } return 0;}